【问题标题】:Windows Forms databinding and nullable typesWindows 窗体数据绑定和可为空的类型
【发布时间】:2012-11-06 08:36:01
【问题描述】:

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

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

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

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

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

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

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

与最近的 Windows 窗体策略一致,即不抛出异常而是假装一切都很好,即使事情失败了(我书中的一个主要烦恼;Form_Load 现在也只是吞下异常,尽管在这种情况下我们当然是方式在错误发生之前过去 Form_Load)。所以实际上我什至无法判断它是否 尝试 做任何事情,但我必须假设它是,因为只要属性不是,双向绑定就可以正常工作可以为空。

我该如何克服这个问题?

我正在尝试为应用程序中的演示者编写一个基类,该基类能够基于简单的命名约定对控件进行数据绑定。演示者知道,对于 TextBox,它应该绑定 Text 属性,对于 CheckBox,它应该绑定“Checked”,等等。属性和控件之间的映射是按约定完成的 - 呈现字段的控件应该与字段和控件类型具有相同的名称。因此,在 TextBox 中呈现的“Name”映射到“NameTextBox”(这是我无论如何都喜欢使用的约定 - 我从来不明白为什么人们仍然喜欢专门用于 GUI 控件的前缀,但没有其他类型的代码!?)和复选框中的“IsMarried”将变为“IsMarriedCheckBox”。

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

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

有办法吗?有什么可以勾搭的吗?或者可以创建我自己的泛型类型来替换 Nullable?由于我不明白为什么不做任何事情它就无法工作,所以很难想象有什么值得尝试解决的问题。

【问题讨论】:

    标签: .net winforms data-binding nullable


    【解决方案1】:
    evaluationDatePicker.DataBindings.Add(
        new Binding("Value", entity, "Nullable", true, DataSourceUpdateMode.OnValidation));
    

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

    【讨论】:

    • 最后一个值也可以省略,虽然我不知道哪个是默认值。无论如何:它有效!我完全不知道为什么。我们已经对绑定说“允许格式化”,在我看来这是否会影响 presentation。但问题在于实体的更新,而该问题实际上已得到纠正。非常感谢 - 我从来没有想过要尝试这个!
    • 很高兴我帮助了 :) methodsignatures 还包含 null 的默认值。在您描述的情况下,这可能是一个有趣的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2013-04-11
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多