我正在使用C#4.0,并创建了DependencyObject MyView。

在MyView中,我有两个DependencyProperty,即PropA和PropB,它们都是 bool 值。

我想要第三个DependencyProperty,PropC和bool,简单地说,应该总是给我(PropA || PropB)。

  • 什么是实现此目的的最佳方法?
  • 我还考虑将PropC设为只读DependencyProperty,但已阅读有关绑定(bind)到只读dp(WPF ReadOnly Dependency Properties using MVVM)
  • 的问题

    最佳答案

    您可以为PropA和PropB使用Dependency Property更改的回调来设置PropC的值(不要将CLR属性包装器用于Dependency Properties,因为它们永远不能被调用)。

    如果您有这三个DP

    public static readonly DependencyProperty PropAProperty =
        DependencyProperty.Register("PropA",
        typeof(bool),
        typeof(MyView),
        new PropertyMetadata(false, PropAPropertyChanged));
    
    public static readonly DependencyProperty PropBProperty =
        DependencyProperty.Register("PropB",
        typeof(bool),
        typeof(MyView),
        new PropertyMetadata(false, PropBPropertyChanged));
    
    public static readonly DependencyProperty PropCProperty =
        DependencyProperty.Register("PropC",
        typeof(bool),
        typeof(MyView),
        new PropertyMetadata(false));
    
    public bool PropA
    {
        get { return (bool)this.GetValue(PropAProperty); }
        set { this.SetValue(PropAProperty, value); }
    }
    public bool PropB
    {
        get { return (bool)this.GetValue(PropBProperty); }
        set { this.SetValue(PropBProperty, value); }
    }
    public bool PropC
    {
        get { return (bool)this.GetValue(PropCProperty); }
        set { this.SetValue(PropCProperty, value); }
    }
    

    您可以像这样使用属性更改后的回调
    private static void PropAPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        MyView myView = source as MyView;
        myView.OnPropChanged();
    }
    private static void PropBPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        MyView myView = source as MyView;
        myView.OnPropChanged();
    }
    public void OnPropChanged()
    {
        PropC = PropA || PropB;
    }
    

    这样,每次PropCPropA更改时,您将始终更新PropB的值

    另外,PropC不必是DP,如果实现INotifyPropertyChanged,它可以是普通的CLR属性。然后实现可以看起来像这样
    public void OnPropChanged()
    {
        OnPropertyChanged("PropC");
    }
    public bool PropC
    {
        get
        {
            return PropA || PropB;
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    您还可以使用PropCPropA绑定(bind)到PropBMultiBinding。让我知道您是否也想举个例子

    关于wpf - 逻辑上合并依赖项属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4741130/

    10-12 04:58