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