【问题标题】:Two-way data binding objects双向数据绑定对象
【发布时间】:2008-10-29 09:57:59
【问题描述】:

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

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

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

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

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

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

我主要想知道该对象到底是如何确定该值已被其他人更改的。它肯定不是轮询数据库。这个系统太棒了。辉煌不止于此。

为简单起见。我如何创建一个对象或对象集合来模仿这种行为。我不会,但我什至看不到如何。

谢谢

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    我很确定任何涉及其他人更改的内容都需要访问数据库。对于双向绑定,您真正需要的只是更改通知 - 即 INotifyPropertyChanged(或每个 FooChanged 属性的 FooChanged 事件)。这一切都被抽象为TypeDescriptor - 即任何使用常规PropertyDescriptor 实现的绑定(它应该)将通过SupportsChangeEventsAddValueChangedRemoveValueChanged 了解通知。

    用于验证 - 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 属性,并将其直接绑定到文本框等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多