Wpf 逻辑组合依赖项属性

Wpf 逻辑组合依赖项属性,wpf,c#-4.0,dependency-properties,Wpf,C# 4.0,Dependency Properties,我正在使用C#4.0并创建了DependencyObject MyView 在我看来,我有两个dependencProperties,PropA和PropB,它们都是布尔值 我想要第三个DependencyProperty,PropC,也就是bool,简单地说,应该总是给我(PropA | | PropB) 实现这一目标的最佳方式是什么 我也在考虑让PropC成为一个只读的DependencyProperty,但是我已经读过关于绑定到只读dp的问题() 链接的网页用于一种不寻常的情况,即“推送”

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

在我看来,我有两个dependencProperties,PropA和PropB,它们都是布尔值

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

  • 实现这一目标的最佳方式是什么
  • 我也在考虑让PropC成为一个只读的DependencyProperty,但是我已经读过关于绑定到只读dp的问题()

  • 链接的网页用于一种不寻常的情况,即“推送”绑定。也就是说,在只读属性上尝试了单向源绑定,而不是在试图绑定到它的另一个属性上。相比之下,如果希望在其他属性上使用单向绑定表达式将属性绑定到其他属性,则可以使用只读依赖项属性,而不会出现任何问题

    编辑:

    以下是一个例子:

    <Grid>
        <Grid.Resources>
            <local:MyObject x:Key="myObject" PropertyA="True" PropertyB="False"/>
        </Grid.Resources>
        <StackPanel DataContext="{StaticResource myObject}">
            <CheckBox IsChecked="{Binding PropertyA}"  Content="PropertyA"/>
            <CheckBox IsChecked="{Binding PropertyB}"  Content="PropertyB"/>
            <CheckBox IsChecked="{Binding PropertyC, Mode=OneWay}" IsEnabled="False"  Content="PropertyC"/>
        </StackPanel>
    </Grid>
    

    您可以使用PropA和PropB的Dependency Property changed回调来设置PropC的值(不要对Dependency属性使用CLR属性包装器,因为它们永远不能保证被调用)

    如果你有这三个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;
    }
    
    这样,每次
    PropA
    PropB
    更改时,您都会更新
    PropC
    的值

    另外,
    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));
        }
    }
    

    您还可以使用
    多重绑定将
    PropC
    绑定到
    PropA
    PropB
    。如果您还需要这方面的示例,请告诉我

    好的,谢谢。我知道这篇文章不是我将要做的,但我很好奇,在这种情况下,是否有类似于使用只读依赖属性的问题。你对如何让PropC工作有什么想法吗?这确实是我的主要问题(我现在编辑了它以反映这一点)。再次感谢
    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));
        }
    }