0

我有几个 RadioButtons 组合在一个组中,因此只能检查一个。RadioButtons 绑定到布尔属性。

这很好用,我的程序会对这些属性的变化做出反应。

假设optA被选中。接下来我选择optB, 的值PropertyB设置为 true ,我的程序会做出相应的反应。但是,此时两者optAoptB都为真,直到单选按钮组更新optA为假,这再次触发我的“IsSelected”事件。

我认为这是完全正确的行为......但是我如何区分来自用户的更改和来自组的自动更改?

编辑:代码

<RadioButton Name="featureCheckBox" GroupName="featureRadioButtonGroup" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" />

 public bool IsSelected { 

        get{ return _isSelected; }
        set { PropertyChanged.ChangeAndNotify(ref _isSelected, value, () => IsSelected); }
    }
4

2 回答 2

2

首先回答你的问题。

更改 IsSelected 属性的设置部分,如下所示。(您当然必须为 if 语句编写实际代码)

public bool IsSelected 
{ 

    get{ return _isSelected; }
    set 
    {
        //If two options are true wait for the second change of values
        //You will now only get One notification per change.
        if (twoOptions are selected) return;
        else PropertyChanged.ChangeAndNotify(ref _isSelected, value, () => IsSelected); 
    }
}

您可以改为只侦听错误值,但随后您必须将任意选项设置为 true 开始。或者您可以只监听真值并忽略所有假值,这意味着您将遇到多个属性为真的问题,直到组框将旧选项更新为假。

现在寻求建议。

一个更好的模型将是这个。

  1. 为每个选项创建一个布尔属性。(optA、optB、optC 等)
  2. 当这些属性之一设置为 true 时,通过声明属性的模型中的代码将所有其他选项设置为 false。
  3. 将每个单选按钮绑定到一个选项but do NOT group them。(将它们分组会导致 UI 强制只选择一个。这不利于 UI 和业务逻辑的分离。)

这样做有几个好处。

  1. 您可以删除 UI 并将其更改为其他内容,而无需更改业务逻辑。(换句话说,您可以将属性绑定到 RadioButtons、ToggleButtons 等,而无需更改ANY代码。)
  2. 您可以更轻松地对业务逻辑进行单元测试,因为甚至不需要 UI。
  3. 您可以实现选项的自定义分组。(也许您将添加实际有效的 optZ 以与 optC 一起选择。在这种情况下,您希望从单选按钮切换,因为它们表明一次只能选择一个选项)
于 2012-11-01T03:46:20.843 回答
0

我想你可以通过它的价值来区分它。True始终从用户设置,因为您无法取消选择单选按钮,并且false始终来自设置为的另一个值true

于 2012-11-01T09:16:30.213 回答