与UI怪癖的双向绑定

时间:2010-09-08 17:56:28

标签: c# winforms visual-studio-2008 data-binding binding

我之前没有真正完成双向绑定项目,所以这可能是一个简单的问题。

我有一个具有所有正确接口的业务对象(INotifyPropertyChanged等...)。我通过BindingSource将名为CPP的Int32属性绑定到名为txtCPP的文本框中。规则规定如果CPP小于0,则文本框应为空白,否则应显示值。

为了实现这一点,我将属性从Int32更改为Int32? (可以为空)当CPP属性的后备变量小于零时,我实际上返回null。

这实际上适用于UI。当我想将业务对象持久化到数据库时,问题就出现了。外部方法获取业务对象,读取其属性(包括CPP)并将它们持久保存到数据库中。显然,CPP不是-1,而是写为null。

我确信在进行双向绑定项目时,我不是第一个提出这个问题的人。如何通过干净的方式处理这些问题,而不会像这样的边缘情况污染表单代码?

1 个答案:

答案 0 :(得分:3)

听起来好像关于盒子空白的规则是一个UI规则,而不是数据规则(所以数据值确实为-1,它应该显示为空白)。

如果是这种情况,让我们将空白逻辑移到UI中。因此,您的数据对象属性返回一个int(它返回int的实际值),然后您可以在显示中将其变形。

一种方法是使用格式化 - 您可以使用数据绑定指定Formatter,或者可以在数据绑定上挂钩Format事件。

当然,当用户在文本框中输入空白值时,您仍然需要决定该怎么做...

这是一个非常简单的例子,使用数据绑定中的Format事件:


var binding = this.textBox1.DataBindings.Add("Text", MyObject, "AValue", true);
binding.Format += (s, args) =>
    {
        int i = (int)args.Value;
        if (i <= 0)
        args.Value = "";
    };

相关问题