C# 双向数据绑定对象

C# 双向数据绑定对象,c#,winforms,C#,Winforms,我最近使用了一个令人惊叹的应用程序。所有的表单都是从它们自己的类继承而来的,一个“表单”有着惊人的功能,看起来很疯狂 我感兴趣的是表单的这个“特性”。这是一个C#WinForms项目,让我大吃一惊 表单绑定到组编写的对象,以支持双向数据绑定(在一定程度上)。他们的行为非常简单: 数据输入表单都有继承自textbox的控件,这些控件绑定到对象的属性,输入数据后立即对其进行验证,如果验证失败,则框为浅粉色,如果验证通过,则框为浅绿色。如果框变为蓝色,这实际上意味着表单绑定到的数据库中的值已更改,并且

我最近使用了一个令人惊叹的应用程序。所有的表单都是从它们自己的类继承而来的,一个“表单”有着惊人的功能,看起来很疯狂

我感兴趣的是表单的这个“特性”。这是一个C#WinForms项目,让我大吃一惊

表单绑定到组编写的对象,以支持双向数据绑定(在一定程度上)。他们的行为非常简单:

数据输入表单都有继承自textbox的控件,这些控件绑定到对象的属性,输入数据后立即对其进行验证,如果验证失败,则框为浅粉色,如果验证通过,则框为浅绿色。如果框变为蓝色,这实际上意味着表单绑定到的数据库中的值已更改,并且在输入有效值时,您对控件所做的更改已立即保存。在这种情况下,有时必须在保存之前填充控件的一部分。但这一切都是自动的。你可以在任何时候停下来,稍后再回来继续,而不会真正拯救你自己

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

所有这些都来自于使用他们自己编写的表单类和绑定到对象属性的文本框控件

我主要想知道这个对象是怎么知道这个值是被其他人改变的。它肯定不是在轮询数据库。这个系统太棒了。辉煌并不止于此

为了简单起见。我如何创建一个对象或对象集合来模仿巴哈维奥呢。我不打算,但我甚至不知道该怎么做


谢谢

我非常确定,任何涉及他人更改的内容都需要访问数据库。对于双向绑定,您真正需要的只是更改通知,即
INotifyPropertyChanged
(或每个
Foo
属性的
FooChanged
事件)。这一切都被抽象为
类型描述符
——也就是说,任何使用常规
属性描述器
实现的绑定(它应该)都将通过
SupportsAngeEvents
AddValueChanged
RemoveValueChanged
了解通知

对于验证-
IDataErrorInfo
是您的朋友;通过实现这一点,您可以自愿提供验证信息(由多个控件使用和显示,例如
DataGridView
)。i、 e

请注意,另一种方法是在数据AOObject上使用
Color
属性,并将其直接绑定到文本框等

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