绑定源概述
在数据绑定中,绑定源对象是指从中获取数据的对象。 本主题讨论可用作绑定源的对象类型。
Windows Presentation Foundation (WPF) 数据绑定支持以下绑定源类型:
绑定源 | 描述 |
---|---|
公共语言运行时 (CLR) 对象 | 可以绑定到任何公共语言运行时 (CLR) 对象的公共属性、子属性以及索引器。 绑定引擎使用 CLR 反射来获取属性的值。 或者,实现了 ICustomTypeDescriptor 或已注册了 TypeDescriptionProvider 的对象也可以与绑定引擎配合使用。 有关如何实现可用作绑定源的类的详细信息,请参阅本主题后面的 实现绑定源的类。 |
动态对象 | 可以绑定到实现 IDynamicMetaObjectProvider 接口的对象的可用属性和索引器。 如果可以访问代码中的成员,则可以绑定到该成员。 例如,如果动态对象允许通过 someObject.AProperty 访问代码中的成员,则可以通过将绑定路径设置为 AProperty 来绑定到该成员。 |
ADO.NET 对象 | 可以绑定到 ADO.NET 对象,例如 DataTable等。 ADO.NET DataView实现了IBindingList接口,该接口提供的更改通知可供绑定引擎侦听。 |
XML 对象 | 可以对 XmlNode、XmlDocument或 XmlElement绑定和运行 XPath 查询。 访问标记中作为绑定源的 XML 数据的便捷方法是通过使用 XmlDataProvider 对象。 有关详细信息,请参阅 如何使用 XMLDataProvider 和 XPath 查询绑定 XML 数据。还可以绑定到 XElement 或 XDocument,也可以使用 LINQ to XML 绑定到在这些类型的对象上运行的查询的结果。 使用 LINQ to XML 访问作为标记中的绑定源的 XML 数据的便捷方法是使用 ObjectDataProvider 对象。 有关详细信息,请参阅 绑定到 XDocument、XElement 或 LINQ for XML 查询结果。 |
DependencyObject 对象 | 您可以绑定任何 DependencyObject的依赖属性。 有关示例,请参阅 绑定两个控件的属性。 |
可以创建自己的绑定源。 本部分讨论在实现类以用作绑定源时需要了解的内容。
如果使用 OneWay 或 TwoWay 绑定(因为希望 UI 在绑定源属性动态更改时更新),则必须实现适当的属性更改通知机制。 建议的机制是让 CLR 或动态类实现 INotifyPropertyChanged 接口。 更多信息,请参阅 实现属性更改通知。
如果创建不实现 INotifyPropertyChanged的 CLR 对象,则必须安排自己的通知系统,以确保绑定中使用的数据保持最新状态。 可以通过支持希望更改通知的每个属性的 PropertyChanged
模式来提供更改通知。 若要支持此模式,请为每个属性定义 PropertyNameChanged 事件,其中 PropertyName 是属性的名称。 每次属性更改时都会引发该事件。
如果绑定源实现其中一种通知机制,则目标更新会自动发生。 如果出于任何原因,绑定源未提供正确的属性更改通知,则可以选择使用 UpdateTarget 方法显式更新目标属性。
以下列表提供了要注意的其他要点:
如果要在 XAML 中创建对象,该类必须具有无参数构造函数。 在某些 .NET 语言(如 C#)中,可能会为你创建无参数构造函数。
你用作绑定源的属性必须是你的类的公共属性。 无法出于绑定目的访问显式定义的接口属性,也不能访问没有基本实现的受保护、专用、内部或虚拟属性。
不能绑定到公共字段。
你类中声明的属性类型就是传递给绑定的类型。 但是,绑定最终使用的类型取决于绑定目标属性的类型,而不是绑定源属性的类型。 如果类型存在差异,可能需要编写转换器来处理自定义属性最初传递到绑定的方式。 有关详细信息,请参阅 IValueConverter。
可以将整个对象用作绑定源。 可以使用 Source 或 DataContext 属性指定绑定源,然后提供空白绑定声明:{Binding}
。 在以下情境中,此功能非常有用:绑定到字符串类型的对象、绑定到具有多个所需属性的对象,或绑定到集合对象。 有关如何绑定到整个集合对象的示例,请参阅 结合使用 Master-Detail 模式与分层数据。
请注意,可能需要应用自定义逻辑,以便数据对绑定的目标属性有意义。 自定义逻辑可能采用自定义转换器的形式(如果不存在默认类型转换器)或 DataTemplate。 有关转换器的详细信息,请参阅 数据绑定概述的数据转换部分。 有关数据模板的详细信息,请参阅 数据模板化概述。
通常,要用作绑定源的对象是自定义对象的集合。 每个对象用作重复绑定的一个实例的源。 例如,你可能有一个由 CustomerOrder
对象组成的 CustomerOrders
集合,其中应用程序循环访问集合以确定存在多少个订单以及每个订单中包含的数据。
可以枚举实现 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 部分信任安全性。
- ObjectDataProvider
- XmlDataProvider
- 指定绑定源
- 数据绑定概述
- 使用 LINQ to XML WPF 数据绑定概述
- 优化数据绑定性能