1

我正在尝试使用 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>
4

1 回答 1

2

您的问题是您假设在Status绑定更改其值时调用属性的“setter”方法。这是不会发生的。Binding 直接调用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方法。

于 2010-07-08T09:13:58.350 回答