使用 LINQ to XML 进行 WPF 数据绑定概述
本文介绍 System.Xml.Linq 命名空间中的动态数据绑定功能。 这些功能可用作 Windows Presentation Foundation (WPF) 应用中用户界面 (UI) 元素的数据源。 此方案依赖于 System.Xml.Linq.XAttribute 和 System.Xml.Linq.XElement 的特殊动态属性。
XAML 和 LINQ to XML
Extensible Application Markup Language (XAML) 是由 Microsoft 创建的用于支持 .NET 技术的 XML 方言。 它在 WPF 中用于表示用户界面元素和相关功能,如事件和数据绑定。 在 Windows Workflow Foundation 中,XAML 用于表示程序结构,如程序控制(工作流)。 XAML 使技术的声明性方面与相关的过程性代码分离,从而可定义更具个性化的程序行为。
XAML 和 LINQ to XML 的交互有两种主要方式:
由于 XAML 文件是格式良好的 XML,因此可以通过 XML 技术(如 LINQ to 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 类)一起使用动态属性。