Windows窗体数据绑定和可空类型

时间:2012-11-06 08:36:01

标签: .net winforms data-binding nullable

我知道我在这里使用的是日落技术,但是我想找到解决问题的方法。

我有一个带有一些简单字段的实体。我可以在这样的表单上绑定文本框

nameTextBox.DataBindings.Add(new Binding("Text", entity, "Name"));

我为日期字段做了同样的事,

evaluationDatePicker.DataBindings.Add(new Binding("Value", entity, "EvaluationDate"));

只要EvaluationDate属性的类型为DateTime,这也可以正常工作。

但是,如果我现在修改实体并使EvaluationDate可以为空,则绑定变为单向。也就是说,控件反映了属性值(只要它不是null),但是当我在UI中选择另一个日期时它不会更新实体。

符合最近的Windows Forms政策,即不抛出异常,而是假装一切都很好,即使事情失败(我书中的一个主要烦恼; Form_Load现在也只是吞下异常,虽然在这种情况下我们当然是这样的在错误发生之前经过Form_Load)。所以实际上我甚至无法判断它是否尝试做任何事情,但我必须假设它是,因为只要属性不是双向绑定工作完全正常为空的。

我怎样才能克服这个?

我要做的是为应用程序中的演示者编写一个基类,它能够根据简单的命名约定对控件进行数据绑定。演示者知道对于TextBox,它应该绑定Text属性,对于CheckBox,它应该绑定“Checked”,依此类推。属性和控件之间的映射是按惯例完成的 - 显示字段的控件应与字段和控件类型具有相同的名称。因此,TextBox中的“Name”映射到“NameTextBox”(这是我喜欢使用的惯例 - 我从未理解为什么人们仍然喜欢专门用于GUI控件的前缀,但没有其他类型的代码!?)和复选框中的“IsMarried”将变为“IsMarriedCheckBox”。

所有这一切都允许演示者提供一个接受对象的方法,“数据源”和一个容器,其中要绑定的控件存在。与必须使用绑定源和编写代码相比,这使得向屏幕添加一堆字段的工作非常迅速,像我一样的解决方案没有给出任何编译器检查,并且意味着很容易通过错误类型和属性重命名来破坏事物。

但为了制作我的小PoC,我想知道我能用这个来处理什么,还有什么样的东西仍需要其他解决方案。如果它可以支持可空类型的属性,整个事情会更有价值,因为我们经常使用它们。 (我也不想停止使用它们;将“有一个值”的概念捆绑在一起,如果是这样,“哪个值”是优雅的,可以减少代码,以及更多的编译器帮助。)

有办法吗?我能挂进去的任何东西?或者可以创建我自己的泛型类型来替换Nullable< T>?由于我不明白为什么在没有我做任何事情的情况下它不起作用,很难想象什么可能值得尝试解决它。​​

1 个答案:

答案 0 :(得分:3)

evaluationDatePicker.DataBindings.Add(
    new Binding("Value", entity, "Nullable", true, DataSourceUpdateMode.OnValidation));

最后一个参数可以根据需要用DataSourceUpdateMode.OnPropertyChanged替换