在数据绑定中,绑定源对象是指从中获取数据的对象。 本文讨论可用作绑定源的对象类型,如 .NET CLR 对象、XML 和 DependencyObject 对象。
绑定源类型
Windows Presentation Foundation (WPF) 数据绑定支持以下绑定源类型:
.NET 公共语言运行时 (CLR) 对象
可以绑定到任何公共语言运行时 (CLR) 对象的公共属性、子属性和索引器。 绑定引擎使用 CLR 反射来获取属性的值。 实现 ICustomTypeDescriptor 或注册 TypeDescriptionProvider 的对象也适用于绑定引擎。
有关如何实现可用作绑定源的类的详细信息,请参阅本文后面的 对象上实现绑定源 。
动态对象
您可以绑定到实现 IDynamicMetaObjectProvider 接口的对象的可用属性和索引器。 如果您能在代码中访问成员,则可以绑定它。 例如,如果动态对象允许你通过
SomeObject.AProperty
代码访问成员,则可以通过将绑定路径AProperty
设置为 来绑定到该成员。ADO.NET 对象
可以绑定到 ADO.NET 对象,例如 DataTable。 ADO.NET DataView 实现 IBindingList 接口,该接口提供绑定引擎侦听的更改通知。
XML 对象
可以绑定到
XPath
,并在XmlNode、XmlDocument或XmlElement上运行查询。 访问标记中绑定源的 XML 数据的简便方法是使用对象 XmlDataProvider 。 有关更多信息,请参阅 使用 XMLDataProvider 和 XPath 查询 (.NET Framework) 绑定 XML 数据。可以使用 LINQ to XML 绑定到 XElement 或 XDocument,也可以绑定到对这些类型的对象运行的查询结果。 使用 LINQ to XML 访问作为标记中的绑定源的 XML 数据的便捷方法是使用 ObjectDataProvider 对象。 如需更多信息,请参阅将 XDocument、XElement 或 LINQ 用于 XML 查询结果的绑定(.NET Framework)。
-
可以绑定到任何 DependencyObject 的依赖属性。 有关示例,请参阅绑定两个控件的属性(.NET Framework)。
在对象上实现绑定源
CLR 对象可能成为绑定源。 实现类以用作绑定源时,需要注意一些事项。
提供更改通知
如果使用OneWay或TwoWay绑定中的任一,请实现合适的“属性已更改”通知机制。 建议的机制是 CLR 或动态类实现 INotifyPropertyChanged 接口。 有关详细信息,请参阅如何:实现属性更改通知(.NET Framework)。
有两种方法可以通知订阅者属性更改:
实现 INotifyPropertyChanged 接口。
这是通知的建议机制。 INotifyPropertyChanged提供绑定系统遵循的PropertyChanged事件。 通过引发此事件并提供已更改的属性的名称,你将通知绑定目标更改。
实现
PropertyChanged
模式。每个需要通知绑定目标其更改的属性都有一个对应的
PropertyNameChanged
事件,PropertyName
是该属性的名称。 每次属性更改时都会引发该事件。
如果绑定源实现其中一种通知机制,则目标更新会自动发生。 如果出于任何原因,绑定源未提供正确的属性更改通知,则可以使用 UpdateTarget 该方法显式更新目标属性。
其他特征
以下列表提供了要注意的其他要点:
作为绑定源的数据对象可以在 XAML 中声明为资源,前提是它们具有 无参数构造函数。 否则,必须在代码中创建数据对象,并将其直接分配给 XAML 对象树的数据上下文,或作为绑定的绑定源。
用作绑定源属性的属性必须是类的公共属性。 无法出于绑定目的访问显式定义的接口属性,也不能访问没有基本实现的受保护、专用、内部或虚拟属性。
不能绑定到公共字段。
在类中声明的属性类型是传递给绑定的类型。 但是,绑定最终使用的类型取决于绑定目标属性的类型,而不是绑定源属性的类型。 如果类型存在差异,可能需要编写转换器来处理自定义属性最初传递到绑定的方式。 有关详细信息,请参阅 IValueConverter。
整个对象作为绑定源
可以将整个对象用作绑定源。 使用Source或DataContext属性指定绑定源,然后提供空白绑定声明: {Binding}
此方案非常有用,包括绑定到类型为字符串的对象、绑定到具有你感兴趣的多个属性的对象,或绑定到集合对象。 有关绑定到整个集合对象的示例,请参阅 如何将 Master-Detail 模式与分层数据(.NET Framework)配合使用。
可能需要应用自定义逻辑,以便数据对绑定的目标属性有意义。 自定义逻辑可能采用自定义转换器或 DataTemplate. 有关转换器的详细信息,请参阅 数据转换。 有关数据模板的详细信息,请参阅数据模板概述(.NET Framework)。
作为绑定源的集合对象
通常,要用作绑定源的对象是自定义对象的集合。 每个对象用作重复绑定的一个实例的源。 例如,你可能有一个由 CustomerOrders
对象组成的 CustomerOrder
集合,其中应用程序循环访问集合以确定存在多少个订单以及每个顺序中包含的数据。
您可以枚举实现 IEnumerable 接口的任何集合。 但是,若要设置动态绑定,以便集合中的插入或删除会自动更新 UI,集合必须实现 INotifyCollectionChanged 接口。 此接口公开在基础集合发生更改时必须引发的事件。
ObservableCollection<T> 类是一个内置实现的 数据集合, 它公开了 INotifyCollectionChanged 接口。 集合中的单个数据对象必须满足前面各节中所述的要求。 有关示例,请参阅如何创建和绑定到 ObservableCollection (.NET Framework)。 在实现自己的集合之前,请考虑使用 ObservableCollection<T> 或现有集合类之一,例如 List<T>, Collection<T>以及 BindingList<T>许多其他集合类。
将集合指定为绑定源时,WPF 不会直接绑定到集合。 相反,WPF 实际上绑定到集合的默认视图。 有关默认视图的信息,请参阅 “使用默认视图”。
如果你有一个高级方案并且想要实现自己的集合,请考虑使用 IList 接口。 此接口提供可由索引单独访问的对象的非泛型集合,从而提高性能。
数据绑定中的权限要求
与 .NET Framework 不同,.NET 以完全信任的安全性运行。 所有数据绑定都以与运行应用程序的用户相同的访问权限运行。