使用 LINQ to XML 进行 WPF 数据绑定概述
本文介绍 System.Xml.Linq 命名空间中的动态数据绑定功能。 这些功能可用作 Windows Presentation Foundation (WPF) 应用中用户界面 (UI) 元素的数据源。 此方案依赖于 System.Xml.Linq.XAttribute 和 System.Xml.Linq.XElement的特殊 动态属性。
XAML 和 LINQ to XML
可扩展应用程序标记语言(XAML)是由Microsoft为支持 .NET 技术而创建的 XML 方言。 它在 WPF 中用于表示用户界面元素和相关功能,例如事件和数据绑定。 在 Windows Workflow Foundation 中,XAML 用于表示程序结构,如程序控制(工作流)。 XAML 使技术的声明性方面能够与定义程序更个性化行为的相关过程代码分开。
XAML 和 LINQ to XML 可通过两种广泛的方式进行交互:
由于 XAML 文件是格式正确的 XML,因此可以通过 LINQ to XML 等 XML 技术查询和操作它们。
由于 LINQ to XML 查询表示数据源,因此这些查询可用作 WPF UI 元素的数据绑定的数据源。
本文档介绍第二种方案。
Windows Presentation Foundation 中的数据绑定
WPF 数据绑定使 UI 元素能够将其中一个属性与数据源相关联。 一个简单的示例是一个 Label,其中的文本显示用户定义对象中的公共属性值。 WPF 数据绑定依赖于以下组件:
元件 | 描述 |
---|---|
绑定目标 | 要与数据源关联的 UI 元素。 WPF 中的视觉元素派生自 UIElement 类。 |
目标属性 | 绑定目标的 依赖属性,该属性反映数据绑定源的值。 DependencyObject 类直接支持依赖项属性,UIElement 派生自该类。 |
绑定源 | 用于为 UI 元素呈现提供一个或多个值的源对象。 WPF 自动支持以下类型作为绑定源:CLR 对象、ADO.NET 数据对象、XML 数据(来自 XPath 或 LINQ to XML 查询)或其他 DependencyObject。 |
源路径 | 绑定源的属性,可解析为要绑定的一个或一组值。 |
依赖属性是特定于 WPF 的概念,它表示 UI 元素的动态计算属性。 例如,依赖属性通常具有父元素提供的默认值或值。 这些特殊属性由 DependencyProperty 类的实例提供支持(而不是与标准属性相同的字段)。 有关详细信息,请参阅 依赖项属性概述。
WPF 中的动态数据绑定
默认情况下,仅当初始化目标 UI 元素时,才会发生数据绑定。 这称为“一次性”绑定。 在大多数情况下,这是不够的;通常,数据绑定解决方案要求在运行时使用下列选项之一动态传播更改:
单向 绑定会自动将一侧的更改传播到另一侧。 最常见的情况是,对源的更改反映在目标中,但有时反向更改可能很有用。
在 双向 绑定中,源的更改会自动传播到目标,对目标的更改会自动传播到源。
若要进行单向或双向绑定,源必须实现更改通知机制,例如,实现 INotifyPropertyChanged 接口,或者为每个支持的属性使用 PropertyNameChanged 模式。
有关 WPF 中的数据绑定的详细信息,请参阅 数据绑定(WPF)。
LINQ to XML 类中的动态属性
大多数 LINQ to XML 类不符合作为合适的 WPF 动态数据源的标准。 某些最有用的信息只能通过方法使用,而不是属性,这些类中的属性不实现更改通知。 为了支持 WPF 数据绑定,LINQ to XML 公开一组 动态属性。
这些动态属性是特殊的运行时属性,可复制 XAttribute 和 XElement 类中现有方法和属性的功能。 它们只添加到这些类中,使其能够充当 WPF 的动态数据源。 为了满足此需求,所有这些动态属性都实现更改通知。 下一节 LINQ to XML 动态属性中提供有关这些动态属性的详细参考。
说明
许多标准公共属性可在 System.Xml.Linq 命名空间中的各种类中找到,可用于一次性数据绑定。 但是,请记住,源和目标都不会在此方案中动态更新。
访问动态属性
无法像标准属性一样访问 XAttribute 和 XElement 类中的动态属性。 例如,在符合 CLR 的语言(如 C#)中,它们不能:
在编译时直接访问。 动态属性对编译器和 Visual Studio IntelliSense 不可见。
在运行时使用 .NET 反射来发现或访问。 即使在运行时,它们也不是基本 CLR 意义上的属性。
在 C# 中,只能通过 System.ComponentModel 命名空间提供的设施在运行时访问动态属性。
但是,相比之下,在 XML 源动态属性中,可以通过以下格式的直接表示法进行访问:
<object>.<dynamic-property>
这两个类的动态属性或者解析为可以直接使用的值,或者解析为必须与索引一起提供的索引器,以便获取结果值或值的集合。 后一种语法采用以下形式:
<object>.<dynamic-property>[<index-value>]
有关详细信息,请参阅 LINQ to XML 动态属性。
若要实现 WPF 动态绑定,动态属性将用于 System.Windows.Data 命名空间提供的设施,尤其是 Binding 类。