我正在尝试使用WPF MultiBinding来定位我在UserControl上定义的自定义属性。我没有运气。我见过的所有示例都内置了.Net属性(Text,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>
答案 0 :(得分:2)
您的问题是,您假设绑定更改其值时调用Status
属性的“setter”方法。这是不会发生的。绑定直接调用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
方法的Register
参数,我们可以指定此属性应具有的默认值,以及每当依赖项属性的值更改时调用的静态回调方法。您可以通过此回调方法调用UpdateForStatus
方法。