繁体   English   中英

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

[英]Windows Forms databinding and nullable types

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

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

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中显示的“名称”映射到“ NameTextBox”(无论如何我还是要使用这种约定-我从不理解为什么人们仍然喜欢使用GUI控件作为前缀,而没有其他类型的代码!!)并且复选框中的“ IsMarried”将变为“ IsMarriedCheckBox”。

所有这些使演示者可以提供一种方法,该方法接受对象,“数据源”和要绑定的控件所在的容器。 与必须使用绑定源和编写代码相比,这使得在屏幕上添加大量字段的工作非常迅速,像我的这样的解决方案不会对编译器进行任何检查,并且意味着很容易通过类型错误和属性重命名来破坏事物。

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

有办法吗? 有什么我可以迷上的吗? 还是可能使我自己的通用类型代替Nullable <T>? 由于我不明白为什么没有我必须做任何事情它还是无法工作,因此很难想象有什么值得尝试解决的办法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM