我的一位同事刚刚在Wpf中遇到了一些奇怪的行为。
首先,这是他想要实现的目标:
在代码中,属性如下所示:
C#
public bool IsFooBarFilterEnabled
{
get
{
return _isFoo && _isBar;
}
}
XAML
<CheckBox IsChecked="{Binding IsFooBarFilterEnabled}" IsEnabled="False" />
然后,当他设置_isFoo
或_isBar
时,他会调用RaisePropertyChanged(()=>IsFooBarFilterEnabled);
到目前为止,一切看起来都不错......但他的代码并不起作用。
我们不得不像这样添加一个空的setter:
public bool IsFooBarFilterEnabled
{
get
{
return _isFoo && _isBar;
}
set{}// that's not what i would call beautifull code
}
那是我的问题所在。如果禁用该复选框,则永远不应调用IsFooBarFilterEnabled上的setter。那么为什么必须创建一个以避免崩溃?我们在这方面的错误是什么?
答案 0 :(得分:2)
默认情况下,Binding Mode
设置为TwoWay
,这意味着如果另一个更改,则必须更新属性和组件。此外,ComboBox
现在是disabled
,它并不意味着它将被 。
您必须创建空集(如果您希望继续TwoWay
绑定)或将Binding Mode
设置为OneWay
(这意味着组件应在更新时更新)财产变化,但不是相反)
以下是一个例子:
<CheckBox IsChecked="{Binding IsFooBarFilterEnabled, Mode=OneWay}" IsEnabled="False" />