在Silverlight中使用多个绑定定制自定义属性

时间:2010-07-08 00:29:15

标签: silverlight multibinding

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

1 个答案:

答案 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方法。