【问题标题】:Data binding support in O/RM tools, how to detectO/RM 工具中的数据绑定支持,如何检测
【发布时间】:2010-11-03 00:21:32
【问题描述】:
我想验证从 O/RM 工具生成的类(单个实体或集合)是否与数据绑定兼容。
我读到 WCF 中支持的数据绑定类型是:一次,一种方式,两种方式,一种方式来自 WCF 中的源。但是“老派”.NET 1.1 数据绑定怎么样?
在代码中检查有什么样的数据绑定支持看起来有点困难。您在运行时和设计时数据绑定支持方面也有所不同。在阅读一些网页时,我阅读了不同类型的实现:实现 IList、IComponent、INotifyPropertyChanged、IBindingList.... pffffff 我不知道在哪里寻找...
【问题讨论】:
标签:
data-binding
binding
wcf-binding
【解决方案1】:
您几乎可以将数据绑定到任何类。假设您创建了一个非常简单的类,具有一些属性,例如,具有姓名和年龄的人。我说的是一个简单的类,完全没有任何花哨的东西。
如果你创建一个 Person 实例,你可以用它做几件事,我假设你正在使用 Windows 窗体,但这主要适用于其他框架:
- 您可以将其属性绑定到控件的属性。
- 您可以将其绑定到数据网格、列表等。在前一种情况下,您可以设置哪些属性绑定到哪些列的映射。在后者中,哪个属性显示在列表中,哪个属性是用户选择的值。
- 更好的是,您可以将其绑定到 bindingSource。
将单个实例绑定到网格或列表并没有那么有用,因此通常要做的是创建实例列表并将它们绑定到网格。更正确的是将列表绑定到绑定源,将网格也绑定到绑定源。
你可以看到一篇很好的文章here关于如何做到这一切。
现在,关于您提到的所有接口,它们都只会为数据绑定体验增加更多价值。让我们谈谈其中的几个。
INotifyPropertyChanged。如果 Person 不实现此接口,则它的“数据绑定性”不低于任何其他对象。然而,Person 的实例不能做的是通知控件它们的属性绑定到后者已更改。试试这个:将 Person 实例的 Name 属性绑定到 TextBox 的 Text 属性。创建一个按钮,单击该按钮会更改该实例名称的值。单击按钮后,您将看到 TextBox 没有更新。另一方面,如果您实现 INotifyPropertyChanged 并让 Name 属性的 setter 引发接口定义的 PropertyChangedEvent,在重复体验后,您将看到文本框自动更新。
IEnumerable。如果您不想将单个 Person 数据绑定到一组人员,则可以创建人员列表并将数据绑定到该列表。例如,List lst = new List(); datagrid、bindingSource 等数据绑定控件如何知道您要绑定到一组 Person(s) 而不是绑定到 lst 本身的属性?这是因为 List 实现了 IEnumerable。因此,每当您将这些控件绑定到任何实现 IEnumerable 的实例时,这些控件就知道您不打算绑定到列表的属性,而是绑定到列表所引用的实例。他们如何知道列表包含的对象类型?为了更通用并支持任何类型的 IEnumerable 实现,他们只需检查列表中第一个元素的类型并假设所有其他元素都相同。
IBindingList:即使 Person 实现了 IPropertyChanged,如果您将 Person 的实例分组到一个 List 中,将该列表绑定到一个控件,并通过代码更改其中一个实例的属性值,您将什么也看不到发生在画面中。发生这种情况是因为 Person 正在通知,而不是绑定源,而是列表。但是该列表不是为数据绑定而制作的,因此它没有监听,也没有将事件传播到控件。实现 IBindingList 的列表(如 BindingList)通过侦听其内容的 PropertyChangedEvent 事件并将它们传播到数据绑定控件来精确地提供更好的数据绑定支持。
恐怕我无法确定对象是否可数据绑定,因为几乎所有对象都是,但我希望我已经为您提供了确定不同级别的数据绑定支持(INotifyPropertyChanged 和 IBindingList)的方法。我假设你知道如何通过反射来检查这些。
【解决方案2】:
具有属性的类的任何实例都是可数据绑定的。 (事实上 any 类的实例具有字段或属性都是可数据绑定的)
在 .NET 中使用反射可以很容易地发现/使用对象中的数据。 (以较小的性能成本)
为了回答这个问题,您需要提供您将遇到的具体使用场景。
Rui 对不同的常见数据绑定模式给出了一些很好的解释,但每种模式都是为了解决特定的问题。
正确的答案总是取决于上下文。
:)