什么是绑定源? (WPF .NET)
在数据绑定中,绑定源对象是指用户从其获取数据的对象。 本文讨论可以用作绑定源的对象类型,如 .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 查询绑定到 XML 数据 (.NET Framework)。使用 LINQ to XML,还可以绑定到 XElement 或 XDocument,或者绑定到对这些类型的对象运行查询而得到的结果。 使用 LINQ to XML 访问 XML 数据(标记中的绑定源)的便捷方法是使用 ObjectDataProvider 对象。 有关详细信息,请参阅绑定到 XDocument、XElement 或 LINQ for 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}
。 适用的场景包括绑定到属于类型字符串的对象、绑定到具有感兴趣的多个属性的对象或绑定到集合对象。 有关绑定到整个集合对象的示例,请参阅如何对分层数据使用主-从模式 (.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 运行时具有完全信任的安全性。 所有数据绑定都以与运行应用程序的用户相同的访问权限运行。