PropertyPath XAML 语法

PropertyPath 对象支持复杂的内联 XAML 语法,用于设置将 PropertyPath 类型作为其值的各种属性。 本主题讨论应用于绑定的 PropertyPath 语法和动画语法。

PropertyPath 的使用情景

PropertyPath 是在多个 Windows Presentation Foundation (WPF) 功能中使用的通用对象。 尽管使用通用 PropertyPath 传输属性路径信息,但是将 PropertyPath 用作类型的每个功能区域的用法却各不相同。 因此,基于每个功能来讨论语法更为可行。

WPF 主要使用 PropertyPath 来描述用于遍历对象数据源属性的对象模型路径,以及描述目标动画的目标路径。

某些样式和模板属性(例如 Setter.Property)采用表面上类似于 PropertyPath 的限定属性名称。 但是,这不是实际的 PropertyPath,而是由 WPF XAML 处理器与 DependencyProperty 的类型转换器联合启用的限定的 owner.property 字符串格式用法

数据绑定中对象的 PropertyPath

数据绑定是一项 WPF 功能,借此可以绑定到任意依赖属性的目标值。 但是,此类数据绑定的源不需要是依赖属性;可以是适用数据提供程序能识别的任意属性类型。 属性路径特别适用于 ObjectDataProvider,后者用于从公共语言运行时 (CLR) 对象及其属性获取绑定源。

请注意,由于与 XML 的数据绑定不使用 Binding 中的 Path,因此它不使用 PropertyPath, 而是使用 XPath 并在数据的 XML 文档对象模型 (DOM) 中指定有效的 XPath 语法。 XPath 也被指定为字符串,但不会在此讨论;请参阅使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据

理解数据绑定中的属性路径的关键是将绑定到单个属性值设置为目标,或者改为绑定到采用列表或集合的目标属性。 如果要绑定集合(例如绑定将根据集合中的数据项数量而展开的 ListBox),则属性路径应引用集合对象,而不是单个集合项。 数据绑定引擎会自动将用作数据源的集合与绑定目标的类型匹配,从而导致使用项数组填充 ListBox 等行为。

直接对象上作为数据上下文的单个属性

<Binding Path="propertyName" ... />

propertyName 必须解析为当前 DataContext 中用于 Path 的属性名称。 如果绑定更新源,则属性必须是可读取/写入的,并且源对象必须可变。

直接对象上作为数据上下文的单个索引器

<Binding Path="[key]" ... />

key 必须是字典或哈希表的类型化索引,或者是数组的整数索引。 此外,键值必须是可直接绑定到所应用属性的类型。 例如,可以通过这种方式使用包含字符串键和字符串值的哈希表以绑定到 TextBox 的文本。 或者,如果键指向集合或子索引,则可使用此语法绑定到目标集合属性。 否则,需要通过 <Binding Path="[key].propertyName" .../> 等语法来引用特定属性。

如有必要,可以指定索引的类型。 有关索引属性路径这方面的详细信息,请参阅 Binding.Path

多个属性(间接属性目标设置)

<Binding Path="propertyName.propertyName2" ... />

propertyName 必须解析为作为当前 DataContext 的属性名称。 路径属性 propertyNamepropertyName2 可以是关系中的任意属性,其中 propertyName2 是存在于类型中的值为 propertyName 的属性。

附加的或类型限定的单个属性

<object property="(ownerType.propertyName)" ... />

圆括号表示 PropertyPath 中的此属性应使用部分限定来构建。 它可以使用 XML 命名空间来查找具有适当映射的类型。 ownerType 通过每个程序集中的 XmlnsDefinitionAttribute 声明搜索 XAML 处理器有权访问的类型。 大部分应用程序都具有映射到 http://schemas.microsoft.com/winfx/2006/xaml/presentation 命名空间的默认 XML 命名空间,因此通常仅有自定义类型或该命名空间之外的类型才需要前缀。 propertyName 必须解析为 ownerType 中存在的属性名称。 此语法一般用于以下任一情况:

  • 路径是在 XAML 中的样式或模板(该样式或模板没有指定的目标类型)中指定的。 除此之外,限定用法一般无效,因为在非样式、非模板情况下,属性存在于实例中,而不是类型中。

  • 属性为附加属性。

  • 要绑定到静态属性中。

用作情节提要目标时,指定为 propertyName 的属性必须为 DependencyProperty

源遍历(绑定到集合的层次结构)

<object Path="propertyName/propertyNameX" ... />

此语法中的 / 用于在分层数据源对象中导航,并且支持使用连续的 / 字符分多个步骤导航层次结构。 源遍历说明了当前记录指针位置,该位置是通过将数据与其视图的 UI 同步而确定的。 有关与分层数据源对象绑定的详细信息,以及数据绑定中当前记录指针的概念,请参阅对分层数据使用主-从模式数据绑定概述

注意

从表面上看,此语法类似于 XPath。 用于绑定到 XML 数据源的真正 XPath 表达式不用作 Path 值,而应用于互斥的 XPath 属性。

集合视图

若要引用一个已命名的集合视图,请使用哈希字符 (#) 为集合视图名称添加前缀。

当前记录指针

若要引用集合视图的当前记录指针或引用主从数据绑定方案,请启用带正斜杠 (/) 的路径字符串。 从当前记录指针开始遍历任何超出正斜杠的路径。

多个索引器

<object Path="[index1,index2...]" ... />

<object Path="propertyName[index,index2...]" ... />

如果给定的对象支持多个索引器,则可以按顺序指定这些索引器,类似于数组引用语法。 上述对象可以是当前上下文,也可以是包含多个索引对象的属性的值。

默认情况下,通过使用基础对象的特性来类型化索引器值。 如有必要,可以指定索引的类型。 有关键入索引器的详细信息,请参阅 Binding.Path

混合语法

上述每条语法都可以独立使用。 例如,下述示例在包含 SolidColorBrush 对象的像素网格数组的 ColorGrid 属性的特定 x、y 处创建了颜色的属性路径:

<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" ... />

属性路径字符串的转义

对于某些业务对象,你可能会遇到这样的情况:属性路径字符串需要转义序列以进行正确分析。 因为大多数此类字符在常用于定义业务对象的语言方面具有类似的命名交互问题,因此转义需要非常少见。

  • 在索引器 ([ ]) 内部,脱字符号 (^) 用于对下一个字符进行转义。

  • 必须(使用 XML 实体)对 XML 语言定义专用的某些字符进行转义。 使用 & 对字符“&”进行转义。 使用 > 对结束标记“>”进行转义。

  • 必须(使用反斜杠 \)对特定于 WPF XAML 分析程序行为的字符进行转义,以处理标记扩展。

    • 反斜杠 (\) 本身是转义字符。

    • 等号 (=) 将属性名与属性值分隔开。

    • 逗号 (,) 用于分隔属性。

    • 右大括号 (}) 是标记扩展的结尾。

注意

从技术上讲,这些转义符还适用于情节提要属性路径,但通常会遍历适用于现有 WPF 对象的对象模型,转义应该是不必要的。

动画目标的 PropertyPath

动画的目标属性必须是采用 Freezable 或基元类型的依赖属性。 但是,类型中的目标属性和最终动画属性可以存在于不同的对象中。 对于动画,属性路径用于通过遍历属性值中的对象-属性关系,定义命名动画目标对象的属性和预期目标动画属性之间的连接。

动画的一般对象-属性注意事项

有关一般动画概念的详细信息,请参阅情节提要概述动画概述

要进行动画处理的值类型或属性必须是 Freezable 类型或基元。 启动路径的属性必须解析为存在于指定的 TargetName 类型中的依赖属性的名称。

为了支持对已冻结的 Freezable 进行动画处理的克隆,由 TargetName 指定的对象必须是 FrameworkElementFrameworkContentElement 派生类。

目标对象上的单个属性

<animation Storyboard.TargetProperty="propertyName" ... />

propertyName 必须解析为存在于指定的 TargetName 类型中的依赖项属性的名称。

间接属性目标设定

<animation Storyboard.TargetProperty="propertyName.propertyName2" ... />

propertyName 必须是存在于指定 TargetName 类型中的 Freezable 值类型或基元的属性。

propertyName2 必须为依赖属性的名称,该属性存在于作为 propertyName 值的对象中。 也就是说,propertyName2 必须作为 propertyNamePropertyType 类型上的依赖属性存在。

因为应用了样式和模板,所以间接设定动画的目标是必要的。 若要定位动画,需在目标对象上添加一个 TargetName,并且该名称由 x:NameName 创建。 虽然模板和样式元素也可以有名称,但这些名称仅在样式和模板的命名范围内有效。 (如果模板和样式与应用程序标记共享命名范围,则名称不唯一。样式和模板的确在实例之间共享,并将保留重复名称。)因此,如果要进行动画处理的元素的各个属性来自样式或模板,则需要从不是来自样式模板的命名元素实例开始,然后将样式或模板可视化树设定为目标,以到达要进行动画处理的属性。

例如,PanelBackground 属性是来自主题模板的完整 Brush(实际上是 SolidColorBrush)。 若要对 Brush 进行完全动画处理,需要 BrushAnimation(可能每个 Brush 类型都需要一个),然而没有这样的类型。 若要对 Brush 进行动画处理,请改为对特定 Brush 类型的属性进行动画处理。 需要获取从 SolidColorBrush 到其 Color 才能在此处应用 ColorAnimation。 本示例的属性路径是 Background.Color

附加属性

<animation Storyboard.TargetProperty="(ownerType.propertyName)" ... />

圆括号表示 PropertyPath 中的此属性应使用部分限定来构建。 可以使用 XML 命名空间来查找类型。 ownerType 通过每个程序集中的 XmlnsDefinitionAttribute 声明搜索 XAML 处理器有权访问的类型。 大部分应用程序都具有映射到 http://schemas.microsoft.com/winfx/2006/xaml/presentation 命名空间的默认 XML 命名空间,因此通常仅有自定义类型或该命名空间之外的类型才需要前缀。 propertyName 必须解析为 ownerType 中存在的属性名称。 指定为 propertyName 的属性必须是 DependencyProperty。 (所有 WPF 附加属性都实现为依赖属性,因此该问题仅与自定义附加属性相关。)

索引器

<animation Storyboard.TargetProperty="propertyName.propertyName2[index].propertyName3" ... />

大部分依赖属性或 Freezable 类型不支持索引器。 因此,动画路径中唯一使用索引器的地方是在用于启动命名目标上的链的属性与最终动画属性之间的中间位置。 在提供的语法中,为 propertyName2。 例如,如果中间属性是属性路径(例如 RenderTransform.Children[1].Angle)中的集合(例如 TransformGroup),则可能需要使用索引器。

代码中的 PropertyPath

PropertyPath 的参考主题中介绍了 PropertyPath 的代码用法,包括如何构造 PropertyPath

一般而言,PropertyPath 使用两个不同的构造函数,一个用于绑定用法和最简单的动画用法,另一个用于复杂动画用法。 将 PropertyPath(Object) 签名用于绑定用法,其中对象为字符串。 将 PropertyPath(Object) 签名用于单步动画路径,其中对象为 DependencyProperty。 将 PropertyPath(String, Object[]) 签名用于复杂动画。 后一种构造函数使用第一个参数的令牌字符串,以及在该令牌字符串中填充位置的对象的数组,以定义属性路径关系。

另请参阅