Wpf 逻辑组合依赖项属性
我正在使用C#4.0并创建了DependencyObject MyView 在我看来,我有两个dependencProperties,PropA和PropB,它们都是布尔值 我想要第三个DependencyProperty,PropC,也就是bool,简单地说,应该总是给我(PropA | | PropB)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的问题() 链接的网页用于一种不寻常的情况,即“推送”
链接的网页用于一种不寻常的情况,即“推送”绑定。也就是说,在只读属性上尝试了单向源绑定,而不是在试图绑定到它的另一个属性上。相比之下,如果希望在其他属性上使用单向绑定表达式将属性绑定到其他属性,则可以使用只读依赖项属性,而不会出现任何问题 编辑: 以下是一个例子:
<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));
}
}