WPF MVVM - 禁用复选框要求绑定到IsEnabled的属性上的setter才能工作

时间:2017-02-08 09:55:23

标签: wpf checkbox mvvm data-binding

我的一位同事刚刚在Wpf中遇到了一些奇怪的行为。

首先,这是他想要实现的目标:

  • 显示已禁用的复选框(因此用户无法通过单击对其进行设置)
  • 将此复选框IsChecked绑定到某些bool值,以通知用户某些过滤器处于活动状态。

在代码中,属性如下所示:

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。那么为什么必须创建一个以避免崩溃?我们在这方面的错误是什么?

1 个答案:

答案 0 :(得分:2)

默认情况下,Binding Mode设置为TwoWay,这意味着如果另一个更改,则必须更新属性和组件。此外,ComboBox现在是disabled ,它并不意味着它将被

您必须创建空集(如果您希望继续TwoWay绑定)或将Binding Mode设置为OneWay(这意味着组件应在更新时更新)财产变化,但不是相反)

以下是一个例子:

<CheckBox IsChecked="{Binding IsFooBarFilterEnabled, Mode=OneWay}" IsEnabled="False" />