我之前没有真正完成双向绑定项目,所以这可能是一个简单的问题。
我有一个具有所有正确接口的业务对象(INotifyPropertyChanged等...)。我通过BindingSource将名为CPP的Int32属性绑定到名为txtCPP的文本框中。规则规定如果CPP小于0,则文本框应为空白,否则应显示值。
为了实现这一点,我将属性从Int32更改为Int32? (可以为空)当CPP属性的后备变量小于零时,我实际上返回null。
这实际上适用于UI。当我想将业务对象持久化到数据库时,问题就出现了。外部方法获取业务对象,读取其属性(包括CPP)并将它们持久保存到数据库中。显然,CPP不是-1,而是写为null。
我确信在进行双向绑定项目时,我不是第一个提出这个问题的人。如何通过干净的方式处理这些问题,而不会像这样的边缘情况污染表单代码?
答案 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 = "";
};