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

.net Windows窗体数据绑定和可空类型,.net,winforms,data-binding,nullable,.net,Winforms,Data Binding,Nullable,我知道我在这里使用日落技术,但我还是想找到解决问题的方法 我有一个带有一些简单字段的实体。我可以在这样的表单上绑定文本框 nameTextBox.DataBindings.Add(new Binding("Text", entity, "Name")); 我对日期字段也做了同样的操作 evaluationDatePicker.DataBindings.Add(new Binding("Value", entity, "EvaluationDate")); 只要EvaluationDate属性

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

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

nameTextBox.DataBindings.Add(new Binding("Text", entity, "Name"));
我对日期字段也做了同样的操作

evaluationDatePicker.DataBindings.Add(new Binding("Value", entity, "EvaluationDate"));
只要EvaluationDate属性的类型为DateTime,这也可以正常工作

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

与最近的Windows窗体策略一致,该策略不抛出异常,而是在出现故障时假装一切正常(在我的书中,这是一个主要的烦恼;Form_Load现在也会吞下异常,尽管在这种情况下,在错误发生之前,我们当然已经远远超过了Form_Load)。所以事实上,我甚至不知道它是否在尝试做任何事情,但我必须假设它是这样的,因为只要属性不可为null,双向绑定就可以正常工作

我怎样才能克服这个问题

我要做的是为应用程序中的演示者编写一个基类,它能够根据简单的命名约定对控件进行数据绑定。演示者知道,对于TextBox,它应该绑定Text属性;对于CheckBox,它应该绑定“Checked”,依此类推。属性和控件之间的映射是通过约定完成的-表示字段的控件应具有与字段加控件类型相同的名称。因此,文本框中显示的“Name”映射为“NameTextBox”(这是我无论如何都喜欢使用的约定-我一直不明白为什么人们仍然喜欢使用带有GUI控件的前缀,但没有其他类型的代码!?),复选框中的“IsMarried”将变成“IsMarriedCheckBox”

所有这些都允许演示者提供一个方法,该方法接受一个对象“datasource”,以及一个要绑定的控件所在的容器。与必须使用bindingsource并编写代码相比,这使得向屏幕添加一组字段的工作非常快速。与我的解决方案类似,这种解决方案不提供任何编译器检查,并且确实意味着很容易通过错误类型和属性重命名来打破错误

但要制作我的小PoC,我想知道我能处理什么,还有什么样的事情需要其他解决方案。如果它能够支持可为空类型的属性,那么整个过程将更有价值,因为我们经常使用它们。(我也不想停止使用它们;将“has a value”和“which value”这两个概念捆绑在一起是很优雅的,这样可以减少代码,并提供更多的编译器帮助。)

有办法吗?我能钓到什么?或者可以让我自己的泛型类型替换为null?因为我不明白为什么我不做任何事情它就不起作用,所以很难想象有什么值得尝试去解决它

evaluationDatePicker.DataBindings.Add(
    new Binding("Value", entity, "Nullable", true, DataSourceUpdateMode.OnValidation));
最后一个参数可以根据需要替换为DataSourceUpdateMode.OnPropertyChanged


最后一个参数可以替换为DataSourceUpdateMode.OnPropertyChanged(根据需要更改)

最后一个值也可以省略,尽管我不知道哪个是默认值。在任何情况下,它都是有效的!我完全不知道为什么。我们对绑定说了“允许格式化”,在我看来,这可能会影响表示。但问题在于实体的更新,而这个问题实际上已经得到了纠正。非常感谢你-我从来没有想过尝试这个!很高兴我帮了忙:)methodsignatures还包含null的默认值。在您描述的情况下,这可能是一个有趣的选择。最后一个值也可以省略,尽管我不知道哪个是默认值。在任何情况下,它都是有效的!我完全不知道为什么。我们对绑定说了“允许格式化”,在我看来,这可能会影响表示。但问题在于实体的更新,而这个问题实际上已经得到了纠正。非常感谢你-我从来没有想过尝试这个!很高兴我帮了忙:)methodsignatures还包含null的默认值。在你描述的案例中,这可能是一个有趣的选择。