WPF Radiobutton TwoWay绑定始终导致两个Property调用。如何区分?

时间:2012-11-01 02:55:15

标签: c# wpf radio-button

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

这非常有效,我的程序会对这些属性的更改做出反应。

假设选择了optA。接下来,我选择optBPropertyB的值设置为true,我的程序会做出相应的反应。但是,此时optAoptB都为真,直到“收音机组”按钮将optA更新为false,再次触发我的“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); }
    }

2 个答案:

答案 0 :(得分: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才能开始。或者您可以只听取真值并忽略所有错误值,这意味着在组框将旧选项更新为false之前,您将遇到多个属性为真的问题。

现在提供建议。

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

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

    1. 您可以删除用户界面并将其更改为其他内容,而无需更改业务逻辑。 (换句话说,您可以将属性绑定到RadioButtons,ToggleButtons等,而无需更改ANY代码。)
    2. 您可以更轻松地对业务逻辑进行单元测试,因为甚至不需要UI。
    3. 您可以实施自定义的选项分组。 (也许你会添加实际上有效的optZ与optC一起选择。在这种情况下,你想要切换单选按钮,因为它们表明一次只能选择一个选项)

答案 1 :(得分:0)

我认为你可以通过它的价值来区分它。 True始终由用户设置,因为您无法取消选择无线电频道,而false始终来自另一个设置为true的值。