Я пытаюсь использовать WPF MultiBinding для предназначения для пользовательского свойства, которое я определил на своем UserControl. У меня нет удачи. Все примеры, что я видел целевые встроенные свойства .NET (текст, ItemSource, IsEnabled). Я задаюсь вопросом, можно ли быть нацелены на пользовательское свойство. Помогите.
///
public partial class ActivityStatusDisplay : UserControl
{
public ActivityStatusDisplay()
{
InitializeComponent();
}
/// <summary>
/// Gets or sets the value for the read/write property named
/// Status.
///
/// </summary>
public TaskStatuses Status
{
get
{
return (TaskStatuses)GetValue(StatusProperty);
}
set
{
SetValue(StatusProperty, value);
UpdateForStatus(value);
}
}
public static readonly DependencyProperty StatusProperty = DependencyProperty.
Register("Status", typeof(TaskStatuses), typeof(ActivityStatusDisplay), null);
с XAML для привязки сходства с одним из них:
<my:DataGrid ItemsSource="{Binding PatientTaskCollection}">
<my:DataGrid.Columns>
<my:DataGridTemplateColumn Header="Status" Width="Auto">
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<my1:ActivityStatusDisplay Margin="3">
<mb:BindingUtil.MultiBindings>
<mb:MultiBindings>
<mb:MultiBinding TargetProperty="Status" Converter="{StaticResource StatusConverter}">
<mb:MultiBinding.Bindings>
<mb:BindingCollection>
<Binding Path="RecoveryTaskStatusID"/>
<Binding Path="Due"/>
</mb:BindingCollection>
</mb:MultiBinding.Bindings>
</mb:MultiBinding>
</mb:MultiBindings>
</mb:BindingUtil.MultiBindings>
</my1:ActivityStatusDisplay>
или что-то как:
<my:DataGrid ItemsSource="{Binding PatientTaskCollection}">
<my:DataGrid.Columns>
<my:DataGridTemplateColumn Header="Status" Width="Auto">
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<my1:ActivityStatusDisplay Margin="3">
<my1:ActivityStatusDisplay.Status>
<mb:MultiBinding Converter="{StaticResource StatusConverter}">
<Binding Path="RecoveryTaskStatusID"/>
<Binding Path="Due"/>
</mb:MultiBinding>
</my1:ActivityStatusDisplay.Status>
Проблема в том, что вы предполагаете, что метод «установщика» для свойства Status
вызывается, когда привязка меняет свое значение. Этого не бывает. Привязка напрямую вызывает метод SetValue
. Следовательно, ваш вызов UpdateForStatus
не происходит, когда значение изменяется в результате привязки.
Вот как должно выглядеть ваше свойство зависимостей (я предполагаю, что TaskStatuses
- это перечисляемый тип)
public TaskStatuses Status
{
get { return (TaskStatuses)GetValue(StatusProperty); }
set { SetValue(StatusProperty, value); }
}
public static readonly DependencyProperty StatusProperty =
DependencyProperty.Register(
"Status",
typeof(TaskStatuses),
typeof(ActivityStatusDisplay),
new PropertyMetaData(TaskStatuses.Default, OnStatusPropertyChanged));
private static void OnStatusPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ActivityStatusDisplay source = (ActivityStatusDisplay)d;
TaskStatuses value = (TaskStatuses)e.NewValue;
source.UpdateForStatus(value);
}
Использование параметра PropertyMetaData
регистра
], мы можем указать значение по умолчанию, которое должно иметь это свойство, и статический метод обратного вызова, который будет вызываться всякий раз, когда изменяется значение свойства зависимости. Из этого метода обратного вызова вы хотите вызвать свой метод UpdateForStatus
.