为什么将我的radiobuttons绑定到应用程序设置会在单击时更改其行为?

sys*_*ich 1 .net application-settings radio-button winforms

可能重复:
使用ApplicationSettings存储WinForms RadioButtons的Checked属性

我在组合框中有三个radiobuttons.当它们不受应用程序设置的约束时,它们的行为正常.

将每个已检查的属性绑定到应用程序设置后,会发生以下情况:我必须单击未经检查的radiobutton两次才能检查它.第一次单击后,所有三个都未选中.

我也试过只绑定其中两个,但行为是一样的.

任何人都可以帮忙吗?

谢谢.

我也在MSDN Visual Basic General Forum上问过.

sys*_*ich 7

您可以将以下事件处理程序添加到GroupBox中三个RadioButton(其中Checked属性绑定到应用程序设置)中的每一个的Click事件:

Private Sub RadioButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tomRadioButton.Click, dickRadioButton.Click, harryRadioButton.Click
    If sender.Checked = False Then
        sender.Checked = True
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

它可以正常工作,即使单击它后检查一个未检查的RadioButton需要半秒钟.

两年前(2008年)在Turbulent Intelect博客上存在的WinForms Databinding帖子的第5部分解释了这个问题的原因(谢谢你,ohadsc,链接):

规则5:不要绑定到可点击的单选按钮

我知道如果你可以将你的一组单选按钮绑定到枚举属性会有多棒.我真的这样做.你认为你只是想把一些Format和Parse事件连接起来转回你的枚举,一切都会好的.如果真的有效的话会很方便.但WinForms并没有因此而被削减.现在有3个完整版本(或者它是3.5版本吗?),情况就是如此.这是因为事件顺序,这不是MS可以切换而不会导致成千上万的开发人员真正被关闭的事情.

问题实际上归结为这样一个事实:与其他控件的数据属性不同,单选按钮的Checked属性实际上不会改变,直到焦点离开单选按钮.和所有WinForms控件一样,焦点实际上并没有留下单选按钮,直到将焦点放到另一个控件之后,实际上直到新焦点控件的Click事件触发后才开始.与单选按钮相关的结果是,如果您尝试绑定它们,数据源中的绑定属性实际上会落后您的单选按钮的可视状态一次单击.如果您只有两个单选按钮,则数据源将与可见状态完全相反,直到您单击其他不触发引用这些数据源属性的操作的位置.这可以使这成为一个真正令人愤怒的错误追踪.我几乎以为我是幻觉.

现在,说实话,它可以使它成功.但它是有史以来最糟糕的klud.好吧也许它不是那么糟糕......但肯定是一个混乱的黑客.对于真正应该可用的东西,需要做很多工作.尽管我可以说,在不放弃数据绑定机制的情况下解决此问题的唯一方法是基本上创建自己的RadioButton控件,具有实际有用的属性更改和事件顺序.您可以从头开始编写一个或子类RadioButton,并使用自定义消息处理覆盖所有事件逻辑.