Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF Radiobutton双向绑定总是导致两个属性调用。如何区分?_C#_Wpf_Radio Button - Fatal编程技术网

C# WPF Radiobutton双向绑定总是导致两个属性调用。如何区分?

C# WPF Radiobutton双向绑定总是导致两个属性调用。如何区分?,c#,wpf,radio-button,C#,Wpf,Radio Button,我有几个单选按钮组合在一个组中,因此只能检查一个。单选按钮绑定到布尔属性 这非常有效,我的程序会对这些属性的更改做出反应 假设选择了optA。接下来,我选择optB,将PropertyB的值设置为true,我的程序会做出相应的反应。但是,此时,optA和optB均为真,直到单选按钮组将optA更新为假,再次触发我的“IsSelected”事件 我认为这是完全正确的行为。。。 但我如何区分来自用户的更改和来自组的自动更改 编辑:代码 <RadioButton Name="featureChe

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

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

假设选择了
optA
。接下来,我选择
optB
,将
PropertyB
的值设置为true,我的程序会做出相应的反应。但是,此时,
optA
optB
均为真,直到单选按钮组将
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); }
    }

公选学校{
获取{return}isSelected;}
设置{PropertyChanged.ChangeAndNotify(ref isSelected,value,()=>isSelected);}
}

首先回答您的问题。

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

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

现在来听听建议。

一个更好的模式是这个

  • 为每个选项创建布尔属性。(optA、optB、optC等)
  • 当其中一个属性设置为true时,通过声明属性的模型中的代码将所有其他选项设置为false
  • 将每个单选按钮绑定到一个选项
    ,但不要将其分组
    。(对它们进行分组会导致UI仅强制选择一个。这不利于UI和业务逻辑的分离。)
  • 这样做有几个好处

  • 您可以删除UI并将其更改为其他内容,而无需更改业务逻辑。(换句话说,您可以将属性绑定到单选按钮、切换按钮等,而无需更改
    任何
    代码。)
  • 您可以更轻松地对业务逻辑进行单元测试,因为甚至不需要UI
  • 您可以实现选项的自定义分组。(可能您会添加实际上可以与optC一起选择的optZ。在这种情况下,您可能希望切换单选按钮,因为它们表示一次只能选择一个选项)

  • 我想你可以根据它的价值来区分它
    True
    始终由用户设置,因为您无法取消选择收音机按钮,
    false
    始终由另一个值设置为
    True

    这在一定程度上回答了我的问题。但是,我在运行时生成单选按钮,因此无法创建固定属性。尽管如此,我还是删除了分组并创建了一个静态的“lastchanged”属性,其中包含对设置为true的最后一个单选按钮的引用。如果发生这种情况,我将所有其他设置为false。所有这些都由模型处理。这也是解决WPF单选按钮分组错误的一个好方法,该错误似乎在今天仍然存在。@user1168261我很高兴它帮助了您。不过,我认为单选按钮分组的功能并不是一个真正的bug。它归结为您是否希望UI强制执行单个选择。在一个非常小的项目中,所有东西都是UI背后的代码,只需将单选按钮分组,让框架来处理它,而不是编写代码,这是非常方便的。我没有说他的行为是一个bug。我指的是这个真正的bug:
    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); 
        }
    }