代码之家  ›  专栏  ›  技术社区  ›  Robert

双向数据绑定对象

  •  0
  • Robert  · 技术社区  · 16 年前

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

    我感兴趣的是这个表单的“特性”。这是一个C Winforms项目,把我炸飞了。

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

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

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

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

    我主要想知道这个对象到底是怎么发现这个值被其他人改变的。它肯定不会轮询数据库。这个系统太棒了。辉煌并没有就此止步。

    为了简单。我如何创建一个对象或对象集合来模仿巴哈维奥。我不想去,但我看不出怎么去。

    谢谢

    1 回复  |  直到 16 年前
        1
  •  1
  •   Marc Gravell    16 年前

    我很确定,任何涉及到其他人的变更都需要访问数据库。对于双向绑定,所有 真的? 需要的是变更通知-即 INotifyPropertyChanged (或) FooChanged 每个事件 Foo 财产)。这一切都抽象成 TypeDescriptor -即任何使用 PropertyDescriptor 实现(它应该)通过 SupportsChangeEvents , AddValueChanged 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);
    }
    

    注意,另一种方法是 Color 属性,并将其直接绑定到文本框等。