0

我刚刚将使用 CSLA 的旧 .NET 1.1 Winforms 应用程序升级到 .NET 4.0 和支持使用 INotifyPropertyChanged 接口的更高版本的 CSLA。

这样做的很大一部分原因是数据绑定得到了改进——例如,能够在绑定时更新更改而不是在验证时进行更新(制表符关闭)。

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

我升级后的问题如下:

  1. 如果我在我的数字框控件中输入一个值,例如 1234,它不会将该值推回它绑定到的类属性中,直到我关闭标签,即使我已经为自定义 BindableValue 属性配置了一个对象绑定源更新模式设置为属性更改。
  2. 在 (1) 中输入值后,如果我返回并删除该值,我将被阻止关闭或单击数字框。我已将 VS2010 设置为在抛出 .NET 异常时抛出,但它没有中断。

我已经有一段时间没有做 WinForms 的东西了,所以我有点不知从何开始。任何提示以及解决方案将不胜感激。

编辑: 我已经尝试了许多不同的事情,但进展不快,现在真的很令人沮丧:

  1. 我遵循了MSDN上的信息,即我添加了一个 ComplexBindingProperties 属性,在文本框的 private keyUp 事件处理程序中略有不同我引发了链接文章 OnBindableValueChanged() 所示的事件。但是,在所有情况下,我的事件 BindableValueChanged 始终为空。
  2. 我阅读了与 (1) 类似的文章,但他们没有使用 EventHandler 声明事件,而是使用了 PropertyChangedEventHandler,尝试了相同的结果。
  3. 我添加了 DefaultBindingProperty 属性。
4

1 回答 1

2

[您也可以在我的公司博客上阅读有关此经验的信息 - OCC 博客 - 绑定问题]

我终于想通了,所以想在这里分享它,以节省其他人在 Google 中阅读大量回复说它们有效但在 .NET 4.0 中似乎不再适用的单调乏味。

好的,我在 Google 上读到的很多东西一直告诉我,我的用户控件必须使用 EventHandler 或 PropertyChangedEventHandler 委托进行 Changed 事件——不同的页面表示不同的委托。我都试过了 - 失败了!

我在 .NET 4.0 中必须做的事情实际上要好得多。简单地说,就像我将用户控件绑定到的类一样,我必须实现 INotifyPropertyChanged 接口。然后在我的用户控件中,当我想推回我的源对象时,我刚刚引发了 PropertyChanged 事件(例如 PropertyChanged("BindableValue"); ),定义了接口,嘿,一切都很好了。

上面的内容要优雅得多,但不幸的是,谷歌索引的文章、论坛和帖子还没有赶上 .NET 4.0 的内容,所以所有现有的东西都会让你陷入死胡同和沮丧。我希望这可以节省其他人很多时间。

于 2012-12-19T13:28:10.370 回答