zoukankan      html  css  js  c++  java
  • [WPF Bug清单]之(2)——RadioButton的IsChecked绑定失效

    .NET Framework已经算是一个很易用的库了。可以自动地为我们做很多事情,而且大都做得还不错。但是自动完成的事情很可能会有隐患,因为Framework本身是并不了解业务逻辑的。它自动完成的事情,可能会给我们帮倒忙。

    RadioButton就是其中一个。

    先来从设置值的角度介绍一下WPF里的Dependency Property(以下简称DP)。在WPF里控制一个控件的DP,有太多的方式。可以用Style,可以用Animation,可以用Data Binding,可以用Trigger,还有最基本直接赋值。控件会综合上面各个方面的值,其及优先级等因素来决定一个DP的最终的值是多少。关于这方面的更多的知识可以参考雨痕关于DP的文章MSDN。(不过不确定MSDN上有没有有关DP设值优先级的系统的介绍哦。)

    多数的控件不会自动的更改自己的某个属性的值。但是总有一些例外。RadioButton就是其中一个。它自动设置什么值了?答案是IsChecked属性。RadioButton的特点是一组RadioButton只有一个被选中。当一个RadioButton被选中的时候,其它所有的RadioButton就会被自动地设置IsChecked属性为False

    问题来了,设置一个属性的方法那么多,它自己自动设置这个属性的时候,应该用什么方法呢?这个问题早在.NET 3.0时就已经有人发现,并在微软的论坛上讨论过。MSFTSam Bent也承认了这个Bug的存在。但问题就在于,无论RadioButton用哪种现有的方法去使得IsChecked属性为False,“总会有些人不高兴”。3.0RadioButton的自动,会让StyleTemplate的值失效;在3.5中,Fix3.0中的这个Bug,但是却导致Binding失效。

    经过笔者验证,在.NET 3.5 SP1中使用了与3.5相同的逻辑,即使Binding失效。下面我们将用一个“为微软选CEO”的示例程序进行验证。

    首先定义一个Person类,如下:

    Person

    由于实现了INotifyPropertyChanged接口,这个类的实例可以被Binding。我们在PropertyChanged的时候,输出一条信息,说明当前的CEO是谁。注意里面IsCeoFalse的时候也会输出消息哦。说明谁被撤职了。

    然后建立UI如下。

    UI

    其中的messageBox用于显示Trace输出的消息。运行结果如下。

    1. 刚启动

    现在MSFT没有CEO,我们点Steve Ballmer选择一个之后如图2

    2. 选择一个

    然后选择另一个作为CEO,之后如图3

    3. 选择另一个

    有心的读者应该已经可以看出,到这里已经可以证明有一个绑定已经失效了。不过我们继续用更明显的方式继续点点。

    再选回Steve Ballmer,如图4

    4. 再选择一个

    结果再没有消息出来了。很明显,Binding失效了。

    根据“小明”同学的回复,此BUG已经在.NET4.0中修复。

    同系列的其它文章:

    [WPF Bug清单]()与之(1)——可以多选的单选ListBox

    [WPF Bug清单](3)——暗中创建文件的打开文件对话框

    [WPF Bug清单](4)——点击RadioButton的空白没有反应

    [WPF Bug清单](5)——隐藏模态对话框后变成非模态

    [WPF Bug清单](6)——ButtonIsCancel属性失效

    [WPF Bug清单](7)——顽固的Error Template

    [WPF Bug清单](8)——RowDefinitionMaxHeight在一定条件下失效

    [WPF Bug清单](9)——消失的光标

  • 相关阅读:
    python爬取二手房库存,存数据库,生成折线图(下)
    python爬取二手房库存,存数数据库,生成折线图(上)
    python爬取二手房库存,存数据库,生成折线图(中)
    vue input 复制后无法修改
    js对象应用问题
    redis5.0集群搭建
    查看java 字节码的方式
    python 运行js
    对java基本对象的构想
    学习第39天
  • 原文地址:https://www.cnblogs.com/nankezhishi/p/WPFBug2.html
Copyright © 2011-2022 走看看