您几乎可以将数据绑定到任何类。假设您创建了一个非常简单的类,具有一些属性,例如,具有姓名和年龄的人。我说的是一个简单的类,完全没有任何花哨的东西。
如果你创建一个 Person 实例,你可以用它做几件事,我假设你正在使用 Windows 窗体,但这主要适用于其他框架: - 你可以将它的属性绑定到控件的属性。- 您可以将其绑定到数据网格、列表等。在前一种情况下,您可以设置哪些属性绑定到哪些列的映射。在后者中,哪个属性显示在列表中,哪个属性是用户选择的值。- 更好的是,您可以将其绑定到 bindingSource。
将单个实例绑定到网格或列表并没有那么有用,因此通常要做的是创建实例列表并将它们绑定到网格。更正确的是将列表绑定到绑定源,并将网格也绑定到绑定源。
你可以在这里看到一篇关于如何做这一切的好文章。
现在,关于您提到的所有接口,它们都只会为数据绑定体验增加更多价值。让我们谈谈其中的几个。
INotifyPropertyChanged。如果 Person 不实现此接口,则它的“数据绑定性”不低于任何其他对象。然而,Person 的实例不能做的是通知控件它们的属性绑定到后者已更改。试试这个:将 Person 实例的 Name 属性绑定到 TextBox 的 Text 属性。创建一个按钮,单击该按钮会更改该实例名称的值。单击按钮后,您将看到 TextBox 没有更新。另一方面,如果您实现 INotifyPropertyChanged 并让 Name 属性的设置器引发接口定义的 PropertyChangedEvent,在重复体验后,您将看到文本框自动更新。
可数的。如果您不想将单个 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)的方法。我假设您知道如何通过反射检查这些。