该 PropertyPath 对象支持复杂的内联 XAML 语法,用于设置以 PropertyPath 类型为值的各种属性。 本主题介绍 PropertyPath 应用于绑定和动画语法的语法。
PropertyPath 的使用场所
PropertyPath 是多个 Windows Presentation Foundation (WPF) 功能中使用的通用对象。 尽管使用了常用的 PropertyPath 来传达属性路径信息,但在每个功能区域中,PropertyPath 作为一种类型的使用方式各不相同。 因此,根据功能记录语法更为实用。
WPF 主要用于 PropertyPath 描述对象模型路径,用于遍历对象数据源的属性,以及描述目标动画的目标路径。
某些样式和模板属性,例如 Setter.Property 采用一个表面上类似于的 PropertyPath限定属性名称。 但这不是真正的PropertyPath,而是由 WPF XAML 处理器和DependencyProperty类型转换器一起启用的限定owner.property字符串格式的用法。
数据绑定中对象的属性路径
数据绑定是一项 WPF 功能,可以通过该功能绑定到任何依赖属性的目标值。 但是,此类数据绑定的源不需要是依赖属性;它可以是适用数据提供程序识别的任何属性类型。 属性路径特别用于 ObjectDataProvider从公共语言运行时 (CLR) 对象及其属性获取绑定源。
请注意,与 XML 的数据绑定不使用 PropertyPath,因为它不在 Binding 中使用 Path。 而是在数据的 XML 文档对象模型(DOM)中使用 XPath 和指定有效的 XPath 语法。 XPath 也指定为字符串,但此处未记录;请参阅 使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据。
了解数据绑定中的属性路径的键是可以将绑定定位到单个属性值,也可以改为绑定到采用列表或集合的目标属性。 如果你是绑定集合,例如, ListBox 绑定将根据集合中的数据项数展开,则属性路径应引用集合对象,而不是单个集合项。 数据绑定引擎会将用作数据源的集合与绑定目标的类型自动匹配,从而导致诸如使用项数组填充 ListBox 等行为。
作为数据上下文的即时对象上的单个属性
<Binding Path="propertyName" ... />
propertyName 必须解析为当前DataContextPath用法中的属性的名称。 如果绑定更新源,该属性必须是可读/写的,并且源对象必须可变。
作为数据上下文的即时对象上的单个索引器
<Binding Path="[key]" ... />
key
必须是字典或哈希表的类型化索引,或者是数组的整数索引。 此外,键的值必须是可以直接绑定到其所应用的属性的类型。 例如,可以使用包含字符串键和字符串值的哈希表绑定到 TextBox 的文本。 或者,如果键指向集合或子索引,则可以使用此语法绑定到目标集合属性。 否则,需要通过如下 <Binding Path="[key].propertyName" .../>
语法引用特定属性。
可以根据需要指定索引的类型。 有关索引属性路径的这一方面的详细信息,请参阅 Binding.Path。
多个属性(间接属性目标)
<Binding Path="propertyName.propertyName2" ... />
propertyName
必须解析为当前属性 DataContext的名称。 路径属性 propertyName
, propertyName2
可以是关系中存在的任何属性,其中 propertyName2
一个属性存在于作为值 propertyName
的类型上。
单个属性、附加属性或其他 Type-Qualified
<object property="(ownerType.propertyName)" ... />
括号表示在PropertyPath中,该属性应通过部分限定来构造。 它可以使用 XML 命名空间查找具有适当映射的类型。 XAML 处理器通过每个程序集中的XmlnsDefinitionAttribute声明获取访问权限,以搜索ownerType
类型。 大多数应用程序的默认 XML 命名空间都映射到了 http://schemas.microsoft.com/winfx/2006/xaml/presentation
命名空间,因此,通常只有自定义类型或在该命名空间之外的类型才需要使用前缀。
propertyName
必须解析为 ownerType
上现有属性的名称。 此语法通常用于以下情况之一:
路径在 XAML 中指定,该路径位于没有指定目标类型的样式或模板中。 限定用法通常对此类情况无效,因为在非样式、非模板情况下,该属性存在于实例上,而不是类型。
该属性是附加属性。
要绑定到静态属性。
用作动画板目标时,propertyName
被指定为的属性必须是 DependencyProperty。
源遍历(绑定到集合层次结构)
<object Path="propertyName/propertyNameX" ... />
此语法中的 /用于在分层数据源对象中导航,并且支持使用连续/字符进入层次结构中的多个步骤。 源遍历考虑当前记录指针的位置,该位置是通过将数据与视图的 UI 同步来确定的。 有关与分层数据源对象的绑定及数据绑定中当前记录指针概念的详细信息,请参阅分层数据中的 Master-Detail 模式使用或数据绑定概述。
集合视图
若要引用命名的集合视图,请使用哈希字符 () 为集合视图名称添加前缀。#
当前记录指针
若要引用集合视图或主从数据绑定方案中的当前记录指针,请以正斜杠(/
)开始路径字符串。 从当前记录指针开始,遍历正斜杠之后的所有路径。
多个索引器
<object Path="[index1,index2...]" ... />
或
<object Path="propertyName[index,index2...]" ... />
如果给定对象支持多个索引器,则可以按顺序指定这些索引器,类似于数组引用语法。 相关对象可以是当前上下文,也可以是包含多个索引对象的属性的值。
默认情况下,索引器值是使用基础对象的特征键入的。 可以根据需要指定索引的类型。 有关输入索引器的详细信息,请参阅 Binding.Path。
混合语法
上面所示的每种语法都可以相互混合使用。 例如,以下示例创建一个ColorGrid
属性路径以在包含SolidColorBrush对象的像素网格数组属性的特定 x,y 处获取颜色:
<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" ... />
用于属性路径字符串的转义符
对于某些业务对象,您可能会遇到属性路径字符串需要使用转义序列才能被正确解析的情况。 转义需求应该是罕见的,因为许多字符在通常用于定义业务对象的语言中都会遇到类似的命名交互问题。
在索引器([ ])内,脱字符 (^)用于转义下一个字符。
必须转义(使用 XML 实体)某些对 XML 语言定义特别的字符。 用于
&
对字符“&”进行转义。 使用>
来转义结束标记“>”。必须转义(使用反斜杠
\
)对 WPF XAML 解析器行为特殊的字符,以便处理标记扩展。反斜杠 (
\
) 是转义字符本身。等号 (
=
) 将属性名称与属性值分开。逗号 (
,
) 分隔属性。右大括号 (
}
) 是标记扩展的结束符。
注释
从技术上讲,这些转义操作也适用于一个情节提要属性路径,但您通常为现有 WPF 对象遍历对象模型,因此转义操作通常是不需要的。
用于动画目标的 PropertyPath
动画的目标属性必须是依赖属性,并且是 Freezable 或基元类型。 但是,类型上的目标属性和最终动画属性可以存在于不同的对象上。 对于动画,通过遍历对象属性关系,使用属性路径来定义命名动画目标对象的属性和目标动画属性之间的连接。
动画的总体 Object-Property 注意事项
有关一般动画概念的详细信息,请参阅 情节提要概述 和 动画概述。
要进行动画处理的值类型或属性必须是 Freezable 类型或基元。 启动路径的属性必须解析为指定 TargetName 类型上存在的依赖属性的名称。
为了支持克隆以便对已冻结的 Freezable 进行动画处理,指定的 TargetName 对象必须是 FrameworkElement 或 FrameworkContentElement 派生类。
目标对象上的单个属性
<animation Storyboard.TargetProperty="propertyName" ... />
propertyName
必须解析为指定 TargetName 类型上存在的依赖属性的名称。
间接属性定位
<animation Storyboard.TargetProperty="propertyName.propertyName2" ... />
propertyName
必须是一个属性,该属性要么是值类型,要么是基元,并存在于指定的TargetName类型上。
propertyName2
必须是对象上存在的依赖属性的名称,该属性是值 propertyName
。 换句话说,propertyName2
必须作为propertyName
PropertyType类型上的依赖属性来定义。
由于应用了样式和模板,因此需要间接定位动画。 为了定位某个动画,您需要在目标对象上设置一个 TargetName,该名称由 x:Name 或 Name 确定。 虽然模板和样式元素也可以具有名称,但这些名称仅在样式和模板的名称范围内有效。 (如果模板和样式确实与应用程序标记共享名称范围,则名称无法唯一。样式和模板在实例之间按字面形式共享,将延续重复的名称。因此,如果想要进行动画处理的元素的各个属性来自样式或模板,则需要从不是样式模板的命名元素实例开始,然后以样式或模板可视化树为目标,到达要进行动画处理的属性。
例如,Background 的 Panel 属性是来自主题模板的完整 Brush(实际上是一个 SolidColorBrush)。 若要将 Brush 完全动画化,则需要一种 BrushAnimation(可能每种 Brush 类型都需要一个),但没有这种类型。 若要对 Brush 进行动画处理,请改为对特定 Brush 类型的属性进行动画处理。 你需要从 SolidColorBrush 到 Color 应用一个 ColorAnimation。 此示例的属性路径为 Background.Color
.
附加属性
<animation Storyboard.TargetProperty="(ownerType.propertyName)" ... />
括号表示PropertyPath中的属性应使用部分限定来构造。 它可以使用 XML 命名空间查找类型。 在ownerType
中,XAML 处理器通过每个程序集中的XmlnsDefinitionAttribute声明访问的类型。 大多数应用程序都将默认 XML 命名空间映射到 http://schemas.microsoft.com/winfx/2006/xaml/presentation
命名空间,因此,通常只有自定义类型或不在该命名空间中的类型才需要前缀。
propertyName
必须解析为存在于 ownerType
上的属性名称。 指定为propertyName
的属性必须是DependencyProperty。 (所有 WPF 附加属性都作为依赖属性实现,因此此问题仅涉及自定义附加属性。
索引器
<animation Storyboard.TargetProperty="propertyName.propertyName2[index].propertyName3" ... />
大多数依赖项属性或 Freezable 类型不支持索引器。 因此,动画路径中,索引器的唯一用法是在命名目标上启动链的属性与最终动画属性之间的中间位置。 在提供的语法中,即 propertyName2
. 例如,如果属性路径中的中间属性是一个集合(例如 TransformGroup),可能需要使用索引器,例如 RenderTransform.Children[1].Angle
。
代码中的 PropertyPath
PropertyPath 的代码使用(包括如何构建 PropertyPath)在 PropertyPath 的参考主题中有记录。
一般情况下, PropertyPath 设计为使用两个不同的构造函数,一个用于绑定用法和最简单的动画用法,另一个用于复杂动画用法。 将 PropertyPath(Object) 签名用于绑定用法,其中对象是字符串。 使用PropertyPath(Object)签名用于单步动画路径,其中对象为DependencyProperty。 使用 PropertyPath(String, Object[]) 签名处理复杂动画。 后一个构造函数使用标记字符串作为第一个参数,以及填充令牌字符串中位置的对象数组来定义属性路径关系。