我最近使用了一个非常令人敬畏的应用程序。所有从他们自己的类继承而来的形式和一个'形式'带来了惊人的功能,看起来很疯狂。
我感兴趣的是表单的这个“功能”。这是一个C#WinForms项目,让我感到震惊。
表单绑定到该组编写的对象以支持双向数据绑定(在一定程度上)。他们表现得非常简单:
数据输入表单都包含从文本框继承的控件,这些控件绑定到对象的属性,输入数据立即验证它,如果验证失败则框为浅粉红色,如果通过则为浅绿色。如果该框变为蓝色,则实际上意味着表单绑定的数据库中的值已更改,并且在输入有效值时会立即保存对控件的更改。情况是,在发生保存之前,有时必须填充一部分控件。但这都是自动的。你可以在任何时候停下来,稍后再回来继续,而不是真正拯救自己。
就像我说的,如果其他人正在编辑相同的记录值,他们更改会导致您的文本框变为蓝色,并且您知道需要重新加载屏幕以查看最新信息。
所有这些都来自于他们使用自己编写的表单类以及绑定到对象属性的自己的文本框控件。
我主要想知道对象如何弄清楚其他人是否改变了价值。它肯定不会轮询数据库。这个系统很棒。辉煌并没有就此止步。
为简单起见。我如何创建一个对象或对象集合来模仿bahaviour。我不会,但我甚至不知道如何。
由于
答案 0 :(得分:1)
我很确定任何涉及其他人改变的事情都需要打到数据库。对于双向绑定,真正需要的只是更改通知 - 即INotifyPropertyChanged
(或每个FooChanged
属性的Foo
事件。这全部被抽象为TypeDescriptor
- 即使用常规PropertyDescriptor
实现(它应该)通过SupportsChangeEvents
,AddValueChanged
和{{1}知道通知的任何绑定}。
验证 - RemoveValueChanged
是你的朋友;通过实现这一点,您可以自愿提供验证信息(由多个控件使用和显示,例如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);
}
属性,并将其直接绑定到文本框等。