PropertyPath XAML 语法
更新:2007 年 11 月
PropertyPath 对象支持复杂内联 XAML 语法以设置将 PropertyPath 类型作为其值的各种属性。本主题讨论应用于绑定的 PropertyPath 语法和动画语法。
本主题包括下列各节。
- PropertyPath 的使用场合
- 数据绑定中对象的 PropertyPath
- 动画目标的 PropertyPath
- 代码中的 PropertyPath
- 相关主题
PropertyPath 的使用场合
PropertyPath 是在一些 Windows Presentation Foundation (WPF) 功能中使用的通用对象。尽管使用此通用 PropertyPath 可以传输属性路径信息,但是将 PropertyPath 用作类型的每个功能区域的用法却各不相同。因此,基于每个功能来讨论语法更实际一些。
WPF 主要使用 PropertyPath 来描述用于传递对象数据源属性的对象模型路径,以及目标动画的目标路径。
某些样式和模板属性,例如 Setter.Property 采用貌似 PropertyPath 的限定属性名。但是,这不是真实的 PropertyPath,而是由 XAML 处理器与 DependencyProperty 的类型转换器联合启用的限定 owner.property 字符串格式用法。
数据绑定中对象的 PropertyPath
数据绑定是 WPF 功能,借此您可以绑定到任意依赖项属性的目标值。但是,这样的数据绑定源不需要是依赖项属性,它可以是适用数据提供程序能识别的任意属性类型。属性路径专用于 ObjectDataProvider,它用于从 公共语言运行时 (CLR) 对象及其属性获取绑定源。
请注意,数据绑定到 XML 不会使用 PropertyPath,因为它不使用 Binding 中的 Path。您需要使用 XPath 并指定数据的 XML 文档对象模型 (DOM) 中的有效 XPath 语法。XPath 也被指定为字符串,但是不会在此讨论,有关更多信息,请参见如何:使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据。
理解数据绑定中的属性路径的关键是您可以将绑定目标定为单个属性值,或者您可以绑定到采用列表或集合的目标属性。如果您要绑定到集合,则您的属性路径应当引用集合,而不是单个集合项。数据绑定引擎会自动将源集合匹配到目标,从而导致诸如使用项数组填充 ListBox 之类的行为。
直接对象上作为数据上下文的单个属性
<Binding Path="propertyName" .../>
属性名称 必须解析为 Path 用法的当前 DataContext 中属性的名称。如果绑定更新源,则属性必须为读写属性,并且源对象必须可变。
直接对象上作为数据上下文的单个索引器
<Binding Path="[key]" .../>
key 必须为字典或哈希表的键入索引,或者为数组的整数索引。同时,键值必须为可直接绑定到所应用属性的类型。例如,包含字符串键和字符串值的哈希表可以使用这种方式绑定到 TextBox 的文本。或者,如果键指向集合或子索引,则您可以使用此语法绑定到目标集合属性。否则,您需要通过类似于 <Binding Path="[key].propertyName" .../> 的语法来引用特定属性。
如果需要,可以指定索引的类型。有关索引属性路径方面的详细信息,请参见 Binding.Path。
多个属性(间接确定属性目标)
<Binding Path="propertyName.propertyName2" .../>
propertyName 必须解析为作为当前 DataContext 的属性的名称。路径属性 propertyName 和 propertyName2 可以是关系中的任意属性,其中 propertyName2 是存在于作为 propertyName 值的类型中的属性。
单个属性,XAML 加载命名范围之外,运行时反射
<object property="ownerType.propertyName" .../>
此语法专用于数据绑定到 CLR 属性的源路径,并且只能是属性的单个步骤路径。propertyName 必须解析为 ownerType 中存在的属性名称。ownerType 需要是在运行时反射基础上找到的某类型。因此,使用 XML 命名空间前缀限定 ownerType 不合法,因为这样的前缀对于反射没有意义,仅对编译时 XAML 有意义。请参见下一节。
单个属性,通过样式/模板附加或等待上下文
<object property="(ownerType.propertyName)" .../>
括号表示 PropertyPath 中的此属性应该使用部分限定来构建。它可以使用 XML 命名空间来查找类型。ownerType 通过每个程序集中的 XmlnsDefinitionAttribute 声明来搜索 XAML 处理器有权访问的类型。大部分应用程序都具有映射到 https://schemas.microsoft.com/winfx/2006/xaml/presentation 命名空间的默认 XML 命名空间,因此通常只有自定义类型或该命名空间之外的类型才需要前缀。propertyName 必须解析为 ownerType 中存在的属性的名称。此语法一般用于下列情况之一:
路径是在 XAML 中的样式或模板(该样式或模板没有指定的目标类型)中指定的。除此之外,限定用法一般无效,因为在非样式、非模式情况下,属性存在于实例中,而不是类型中。
属性为附加属性。
您要绑定到静态属性。在这种情况下,ownerType 是真正的类型。
当用作演示图板目标时,指定为 propertyName 的属性必须为 DependencyProperty。
源遍历(绑定到集合的层次结构)
<object Path="propertyName/propertyNameX" .../>
此语法中的 / 用于在分层数据源对象中导航,并且支持使用连续的 / 字符分多个步骤导航层次结构。源遍历说明了当前记录指针位置,该位置是通过将数据与其视图的 UI 同步而确定的。有关与分层数据源对象的绑定的详细信息,以及数据绑定中当前记录指针的概念,请参见如何:对分层数据使用主-从模式或数据绑定概述。
说明: |
---|
此语法貌似 XPath。绑定到 XML 数据源的真实 XPath 表达式不用作 Path 值,而应当用于相互独占的 XPath 属性。 |
多个索引器
<object Path="[index1,index2...]" .../>
or
<object Path="propertyName[index,index2...]" .../>
如果给定的对象支持多个索引器,则可以按顺序指定这些索引器,类似于数组引用语法。所讨论的对象可以是当前上下文,也可以是包含多索引对象的属性值。
默认情况下,通过使用基础对象的特性来键入索引器值。如果需要,可以指定索引的类型。有关键入索引器的详细信息,请参见 Binding.Path。
混合语法
以上显示的每条语法都可以独立使用。例如,下面的示例创建了一个属性路径,该路径指向 ColorGrid 属性(该属性包含 SolidColorBrush 对象的像素网格数组)的特定 x,y 值处的颜色:
<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" .../>
动画目标的 PropertyPath
动画目标属性必须是依赖项属性,它采用 Freezable 或基元类型。不过,类型中的目标属性和最终动画属性可以存在于不同的对象中。对于动画,属性路径用于通过遍历属性值中的对象-属性关系,来定义命名动画目标对象的属性和预期目标动画属性之间的连接。
动画的一般对象属性注意事项
要进行动画处理的值类型或属性必须是 Freezable 类型或基元。启动路径的属性必须解析为存在于指定的 TargetName 类型中的依赖项属性的名称。
为了支持克隆对已冻结的 Freezable 的动画处理,TargetName 指定的对象必须为 FrameworkElement 或 FrameworkContentElement 派生类。
目标对象上的单个属性
<animation Storyboard.TargetProperty="propertyName" .../>
propertyName 必须解析为存在于指定的 TargetName 类型中的依赖项属性的名称。
间接确定属性目标
<animation Storyboard.TargetProperty="propertyName.propertyName2" .../>
propertyName 必须为属于 Freezable 值类型或基元的属性,该属性存在于指定的 TargetName 类型中。
propertyName2 必须为依赖项属性的名称,该属性存在于作为 propertyName 值的对象中。换言之,propertyName2 必须作为依赖项属性存在于类型中,该类型为 propertyName PropertyType。
因为应用了样式和模板,间接确定动画的目标是必要的。为了确定动画的目标,您需要目标对象上的 TargetName,该名称是由 x:Name 或 Name 建立的。虽然模板和样式元素也可以有名称,但是这些名称仅在样式和模板的命名范围内有效。(如果模板和样式与应用程序标记共享命名范围,则名称不可能是唯一的。按字面而言,样式和模板是在实例之间共享的,并会永久保留重复名称。)因此,如果您希望进行动画处理的元素的各个属性来自某个样式或模板,则您需要从不是来自样式模板的命名元素实例开始,以样式或模板可视树作为目标,来找到您希望进行动画处理的属性。
例如,Panel 的 Background 属性是来自主题模板的完整 Brush(实际上为 SolidColorBrush)。若要对 Brush 进行完全动画处理,将需要 BrushAnimation(可能每个 Brush 类型都需要一个),然而没有这样的类型。若要对 Brush 进行动画处理,请改为对特定 Brush 类型的属性进行动画处理。您需要从 SolidColorBrush 到其 Color,在那里才能应用 ColorAnimation。本示例的属性路径应该为 Background.Color。
附加属性
<animation Storyboard.TargetProperty="(ownerType.propertyName)" .../>
括号表示 PropertyPath 中的此属性应该使用部分限定来构建。它可以使用 XML 命名空间来查找类型。ownerType 通过每个程序集中的 XmlnsDefinitionAttribute 声明来搜索 XAML 处理器有权访问的类型。大部分应用程序都具有映射到 https://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, array<Object[])。后一个构造函数使用第一个参数的标记字符串,但在该标记字符串的位置填充了一个对象数组来定义属性路径关系。