【问题标题】:Targeting Custom Property with Multi Bindings in Silverlight在 Silverlight 中使用多重绑定定位自定义属性
【发布时间】:2010-07-08 00:29:14
【问题描述】:

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

【问题讨论】:

    标签: silverlight multibinding


    【解决方案1】:

    您的问题是,您假设 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);
    }
    

    使用Register 方法的PropertyMetaData 参数,我们可以指定该属性应具有的默认值,以及每当依赖属性的值更改时调用的静态回调方法。您希望通过此回调方法调用您的 UpdateForStatus 方法。

    【讨论】:

    • 现在头晕目眩……那行得通。我一定会为我们从这件事上赚到的任何钱寄给你版税。非常感谢,非常感谢。
    • 我试图“投票”你的答案,但我太菜鸟了。
    • @Mark:很高兴它有帮助,不需要钱。单击此答案旁边的大勾号就足够了。
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 2011-04-11
    • 2011-03-20
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多