2008-10-29 87 views
0

我最近使用了一个令人惊叹的应用程序。从他们自己的类和“表单”继承而来的所有表单都带有惊人数量的功能,并且看起来像是坚果。双向数据绑定对象

我感兴趣的是这种形式的'功能'。这是一个C#WinForms项目,让我失望了。

表单被绑定到该组写入的对象以支持双向数据绑定(在某种程度上)。他们的行为方式非常简单:

数据输入表单都具有从文本框继承的控件,并且这些控件都绑定到对象的属性,输入数据立即进行验证,并且如果验证失败,则框为淡粉色,并且a如果它通过,则呈淡绿色。如果盒子变成蓝色,这实际上意味着表单所绑定的数据库中的值已更改,并且在输入有效值时立即保存对控件的更改。有时在保存发生之前有时需要填充一部分控件。但它全是自动的。你可以在任何时候停下来,稍后再回来继续,而不需要真正保存自己。

而且就像我说如果别人正在编辑相同的记录值,他们改变导致您的文本框变为蓝色,你知道你需要重新加载屏幕以查看最新的信息。

所有这些都来自于他们自己编写的窗体类以及绑定到对象属性的自己的文本框控件。

我主要想知道如何让对象找出价值已被其他人改变。它肯定不轮询数据库。这个系统很棒。辉煌并没有停止在那里。

为简单起见。我该如何创建一个对象或一组对象来模仿这个行为。我不会去,但我什至不知道如何。

感谢

回答

1

我敢肯定,任何涉及其他人的改变会需要打的数据库。对于双向绑定,您需要的所有真实都需要更改通知 - 即INotifyPropertyChanged(或每个Foo属性的FooChanged事件)。这全部抽象为TypeDescriptor - 即使用常规的PropertyDescriptor实现(它应该)将通过SupportsChangeEvents,AddValueChangedRemoveValueChanged知道的通知的任何绑定。

验证 - IDataErrorInfo是你的朋友;通过执行此操作,您可以自愿提供验证信息(由多个控件使用并显示,如DataGridView)。即

IDataErrorInfo dei = obj as IDataErrorInfo; 
if(dei != null) { // supports validation 
    string err = dei["PropName"]; // or .Error for overall status 
    bool clean = string.IsNullOrEmpty(err); 
} 

注意,可替换的方法将是对数据aobject一个Color属性,并结合其直接向文本框等