C#Winforms自定义控件,对propertychange的绑定不起作用并导致标签问题

时间:2012-11-25 17:38:15

标签: winforms c#-4.0 data-binding custom-controls

我刚刚升级了使用CSLA到.NET 4.0的旧.NET 1.1 Winforms应用程序以及支持使用INotifyPropertyChanged界面的更高版本的CSLA。

这样做的很大一部分原因是数据绑定改进了 - 例如能够在绑定时更新更改,而不是在验证时更新(标签关闭)。

我有自定义用户控件,NumberBox。从本质上讲,它只是一个文本框,其中包含一些属性,如数字类型,小数位等。我已经公开了一个名为BindableValue的 object 类型的公共属性。正是这个属性我绑定了我的CSLA类(标准.NET类继承验证规则,属性改变和各种东西)整数属性,在这种特殊情况下它的类属性是整数。

我升级的问题如下:

  1. 如果我输入一个值,例如1234,进入我的号码框控件,它不会将值推回到班级'即使我已将对象绑定源配置为自定义BindableValue属性且更新模式设置为属性更改,它也会被绑定到属性。
  2. 如果我返回并删除了值,则输入(1)中的值,然后阻止选项卡关闭或单击数字框。我已经设置VS2010在抛出.NET异常时抛出,但它没有破坏。
  3. 自从我做了WinForms之后已经有一段时间了,所以我有点亏本从哪里开始。任何提示和解决方案都将非常感激。

    修改 我已经尝试了很多不同的事情,而且无处可去,现在变得非常令人沮丧:

    1. 我跟踪了MSDN上的信息,即我添加了一个ComplexBindingProperties attrib,在文本框的私有keyUp事件处理程序中略有不同我引发了事件,如链接文章OnBindableValueChanged()所示。但是在所有情况下,我的事件BindableValueChanged始终为null。
    2. 我读过与(1)类似的文章,但不是使用EventHandler声明事件,而是使用了PropertyChangedEventHandler,尝试了同样的结果。
    3. 我添加了DefaultBindingProperty attrib。

1 个答案:

答案 0 :(得分:2)

[你也可以在我的公司博客上阅读这个经历 - OCC Blog - Binding woes]

我终于想通了,所以我想在这里分享一下,为了拯救别人拖延浏览谷歌的繁琐工作,阅读许多回复说他们有效,但在.NET 4.0中似乎不再适用。

好吧,我在Google上阅读的很多内容都告诉我,我的usercontrol必须使用EventHandler或PropertyChangedEventHandler委托来更改事件 - 不同的页面表示不同的委托。我试过了 - 失败!

我在.NET 4.0中所做的事情实际上要好得多。就像我的类一样,我绑定了我的usercontrol,我必须实现INotifyPropertyChanged接口。然后在我的usercontrol中,当我想要回到我的源对象时,我刚刚提出了PropertyChanged事件(例如PropertyChanged(“BindableValue”);)定义了接口,并且hey presto再次与世界相处得很好。

上面的内容更为优雅,但不幸的是,谷歌索引的文章,论坛和帖子还没有赶上.NET 4.0,因此所有现有的东西都会让你陷入死胡同和挫折之中。我希望这能节省很多时间。