绑定源概述
更新:2007 年 11 月
在数据绑定中,绑定源(源)对象指的是您从其获取数据的对象。本主题讨论可以用作源的对象类型。
本主题包括下列各节。
- 绑定源
- 将 CLR 类用作绑定源对象
- 将整个对象用作绑定源
- 将集合对象用作绑定源
- 权限要求
- 相关主题
绑定源
Windows Presentation Foundation (WPF) 数据绑定支持下列类型的绑定源:
绑定源 |
说明 |
---|---|
公共语言运行时 (CLR) 对象 |
您可以绑定到任何公共语言运行时 (CLR) 对象的公共属性、子属性以及索引器。绑定引擎使用 CLR 反射来获取属性值。另外,绑定引擎也可以与实现 ICustomTypeDescriptor 或注册了 TypeDescriptionProvider 的对象一起使用。 有关如何实现可用作源对象的类的更多信息,请参见下一节。 |
ADO.NET 数据 |
您可以绑定到 ADO.NET 对象,例如 DataTable。ADO.NET DataView 实现 IBindingList,从而提供绑定引擎侦听的更改通知。 有关示例,请参见 绑定到 ADO.NET 数据集示例。 |
XML 数据 |
您可以绑定到并运行 XmlNode、XmlDocument 或 XmlElement 上的 XPath 查询。访问 XML 数据(标记中的绑定源)的简便方式是使用 XmlDataProvider 对象。有关更多信息,请参见如何:使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据。 您还可以绑定到 XElement 或 XDocument,或者绑定到使用 LINQ for XML 对这些类型的对象运行查询而得到的结果。访问 XML 数据(标记中的绑定源)的简便方式是使用 ObjectDataProvider 对象。有关更多信息,请参见 如何:绑定到 XDocument、XElement 或 LINQ for XML 查询结果。 |
您可以绑定到任意 DependencyObject 的依赖项属性。有关示例,请参见 如何:绑定两个控件的属性。 |
将 CLR 类用作绑定源对象
本节讨论您在实现 CLR 类以用作源对象时需要了解的内容。
提供更改通知
如果您要使用 OneWay 或 TwoWay 绑定(您希望 UI 在源属性发生动态变化时进行更新),则必须实现一个适当的“属性已更改”通知机制。建议的机制是使 CLR 类实现 INotifyPropertyChanged 接口。有关更多详细信息,请参见如何:实现属性更改通知。
如果您不实现 INotifyPropertyChanged,则必须安排您自己的通知系统,确保绑定中使用的数据是最新的。您可以通过支持需要更改通知的每个属性的 PropertyChanged 模式来提供更改通知。若要支持此模式,请定义每个属性的属性名称 Changed 事件,其中属性名称 是属性的名称。每次更改属性时都会引发此事件。
如果源对象实现了正确的通知机制,则会自动进行目标更新。如果源对象由于某种原因未提供正确的属性更改通知,那么您可以选择使用 UpdateTarget 方法来显式更新目标属性。
其他特征
下表提供了需要注意的其他几个要点:
如果您要在 XAML 中创建对象,则类必须使用默认构造函数。在某些 .NET 语言(例如 C#)中,可能已为您创建默认构造函数。
用作绑定源属性的属性必须是类的公共属性。不能出于绑定目的来访问显式定义的接口属性,也不能访问没有基实现的受保护的私有或虚拟属性。
您不能绑定到 CLR 类的公共字段。
在您的类中声明的属性类型是传递到绑定的类型。但是,绑定最终使用的类型取决于绑定目标属性的类型,而不是源属性的类型。如果类型不同,您可能需要编写一个转换器来处理最初将您的自定义属性传递到绑定的方式。有关更多信息,请参见 IValueConverter。
将整个对象用作绑定源
可以将整个对象用作绑定源。要实现此目的,可以使用 Source 或 DataContext 属性将对象指定为绑定源,然后提供一个不含路径的空白绑定声明:{Binding}。这种方法可发挥较大作用的情况包括:要绑定到属于类型字符串的对象;要绑定到具有您关注的多个属性的对象;要绑定到集合对象。有关绑定到整个集合对象的示例,请参见如何:对分层数据使用主-从模式。
请注意,您可能需要应用自定义逻辑,使数据对您的绑定目标属性有意义。自定义逻辑的形式可以是自定义转换器(如果默认类型转换不存在)或者 DataTemplate。有关转换器的更多信息,请参见数据绑定概述中“数据转换”一节。有关数据模板的更多信息,请参见数据模板化概述。
将集合对象用作绑定源
通常,您要用作源的对象是包含多个自定义对象的集合,其中的每个自定义对象都代表一个数据对象,该数据对象用作重复绑定的一个实例的源。例如,您有一个 CustomerOrders 集合,它由 CustomerOrder 对象组成,您的应用程序可以循环访问该集合以确定存在多少订单以及每个订单包含的数据。
可以枚举实现 IEnumerable 接口的任何集合。但是,若要设置动态绑定,以便集合中的插入或删除操作可以自动更新 UI,则该集合必须实现 INotifyCollectionChanged 接口。此接口公开一个事件,只要基础集合发生更改,就必须引发该事件。
WPF 提供 ObservableCollection<T> 类,此类是公开 INotifyCollectionChanged 接口的数据集合的内置实现。该集合中的各个数据对象必须满足前面各节中所述的要求。有关示例,请参见如何:创建和绑定到 ObservableCollection。在实现自己的集合之前,请先考虑使用 ObservableCollection<T> 或现有集合类之一,如 List<T>、Collection<T> 和 BindingList<T>,以及许多其他集合类。
WPF 从不直接绑定到集合。如果您指定集合作为数据源,则 WPF 实际会绑定到该集合的默认视图。有关默认视图的信息,请参见数据绑定概述。
如果您有高级方案并且希望实现自己的集合,请考虑使用 IList,它提供可以按索引逐个访问的对象的非泛型集合,因而可提供最佳性能。
权限要求
下表总结了在完全信任或部分信任级别下执行的应用程序中可以绑定到的属性类型:
属性类型 (所有访问修饰符) |
CLR 属性 |
CLR 属性 |
依赖项属性 |
依赖项 属性 |
---|---|---|---|---|
信任级别 |
完全信任 |
部分信任 |
完全信任 |
部分信任 |
公共类 |
是 |
是 |
是 |
是 |
私有类 |
是 |
否 |
是 |
是 |
下表描述了数据绑定中有关权限要求的要点:
对于 CLR 属性,只要绑定引擎能够使用反射访问源属性,数据绑定就能进行。否则,绑定引擎会发出找不到属性的警告,并使用回退值或默认值(如果可用)。
始终可以绑定到依赖项属性。
XML 绑定的权限要求与此类似:在部分信任沙盒中,如果 XmlDataProvider 无权访问给定的数据,则它将失败。
有关部分信任安全性的更多信息,请参见 Windows Presentation Foundation 部分信任安全性。