我想验证来自O / RM工具的生成的类(单个实体或集合)是否与数据绑定兼容。
我读到WCF中支持的数据绑定类型是:一次,单向,双向,从WCF中的一种方式。但是如何“老派”.NET 1.1数据绑定呢?
在代码中检查哪种数据绑定支持是很困难的。您在运行时和设计时数据绑定支持方面也存在差异。在阅读一些网页时,我阅读了不同类型的实现:实现IList,IComponent,INotifyPropertyChanged,IBindingList .... pffffff我不确切知道在哪里寻找......
答案 0 :(得分:2)
您几乎可以对任何课程进行数据绑定。让我们假设您创建了一个非常简单的类,其中包含一些属性,比如具有名称和年龄的Person。我说的是一个简单的简单课程,对此毫无兴趣。
如果你创建了Person的实例,你可以用它做几件事,我假设你正在使用Windows Forms,但这主要适用于其他框架: - 您可以将其属性绑定到控件的属性。 - 您可以将其绑定到数据网格,列表等。在前一种情况下,您可以设置哪些属性绑定到哪些列的映射。在后者中,哪个属性显示在列表中,哪个属性是用户选择的值。 - 更好的是,你可以将它绑定到bindingSource。
将单个实例绑定到网格或列表并不是很有用,因此通常要做的是创建实例列表并将它们绑定到网格。更正确的是将列表绑定到绑定源,将网格绑定到绑定源。
你可以看到关于如何做到这一切的好文章here。
现在,关于您提到的所有接口,它们都只为数据绑定体验增加了更多价值。我们来谈谈其中的一些。
INotifyPropertyChanged的。如果没有实现此接口,Person不会比任何其他对象更少“databindable”。但是,Person的哪些实例无法通知控件,这些控件的属性与后者已更改的属性绑定。试试这个:将Person实例的Name属性绑定到TextBox的Text属性。创建一个按钮,单击该按钮可更改该实例的名称的值。单击按钮后,您将看到TextBox未更新。另一方面,如果您实现了INotifyPropertyChanged并且让Name属性的setter引发了接口定义的PropertyChangedEvent,则在重复该体验后,您将看到文本框自动更新。
IEnumerable的。如果不是单个Person,而是想要不与一组人进行数据绑定,则可以创建人员列表和数据绑定到该列表。我们举个例子,List lst = new List();数据绑定控件如datagrid,bindingSource等如何知道你想要绑定到一组Person而不是lst本身的属性?这是因为List实现了IEnumerable。因此,每当您将这些控件绑定到实现IEnumerable的任何实例时,控件都知道您打算不绑定到列表的属性,而是绑定到列表引用的实例。他们如何知道列表包含的对象类型?为了更通用并支持任何类型的IEnumerable实现,它们只检查列表中第一个元素的类型,并假设所有其他元素都相同。
IBindingList:即使Person实现了IPropertyChanged,如果将Person的实例分组到List中,该列表绑定到控件,并且通过代码更改其中一个实例的属性值,您将看不到任何内容发生在屏幕上。发生这种情况是因为Person正在通知,而不是绑定源,而是列表。但是列表不是用于数据绑定,因此它不是监听,也不是将事件传播给控件。实现IBindingList的列表(如BindingList)通过监听其内容的PropertyChangedEvent事件并将它们传播到数据绑定控件来提供更好的数据绑定支持。
我很害怕我没有办法确定某个对象是否可以数据绑定,因为几乎所有这些都是,但我希望我已经给你一种确定不同级别的数据绑定支持的方法(INotifyPropertyChanged和IBindingList)。我假设你知道如何通过反思检查这些。
答案 1 :(得分:1)
具有属性的类的任何实例都是可绑定数据的。 (事实上任何具有字段或属性的类的实例都是可绑定数据的)
在.NET中使用反射可以非常轻松地发现/使用对象中的数据。 (性能成本很低)
要回答此问题,您需要提供您将遇到的具体使用方案。
Rui对不同的常见数据绑定模式给出了一些很好的解释,但每个都用于解决特定问题。
右答案总是取决于上下文。
:)