Property-path 语法

可以使用 PropertyPath 类和字符串语法在 XAML 或代码中实例化 PropertyPath 值。 PropertyPath 值由数据绑定使用。 类似的语法用于定位情节提要动画。 对于这两种情况,属性路径描述了一个或多个对象属性关系的遍历过程,该过程最终解析为一个单一属性。

可以直接将属性路径字符串设置为 XAML 中的属性。 可以使用相同的字符串语法来构造 PropertyPath,以在代码中设置 Binding,也可以通过使用 SetTargetProperty 在代码中设置动画目标。 Windows 运行时中有两个不同的功能区域,它们使用属性路径:数据绑定和动画目标。 动画目标不会在 Windows 运行时实现中创建基础属性路径语法值,而是将信息保留为字符串,但对象属性遍历的概念非常相似。 每个目标的数据绑定和动画定位在评估属性路径时略有不同,因此我们分别为数据绑定和动画定位描述属性路径语法。

数据绑定中对象的属性路径

在 Windows 运行时中,可以绑定到任何依赖属性的目标值。 数据绑定的源属性值不必是依赖属性;它可以是业务对象的属性(例如,用 Microsoft .NET 语言或C++编写的类)。 或者,绑定值的源对象可以是应用已定义的现有依赖对象。 源可以通过简单的属性名称或业务对象的对象关系图中的对象属性关系的遍历来引用。

可以绑定到单个属性值,也可以绑定到包含列表或集合的目标属性。 如果源是集合,或者路径指定集合属性,则数据绑定引擎会将源的集合项与绑定目标匹配,从而导致诸如使用数据源集合中的项列表填充 ListBox 等行为,而无需预测该集合中的特定项。

遍历对象图

表示对象图中对象属性关系的遍历的语法元素是点 (.) 字符。 属性路径字符串中的每个点表示对象(点左侧)与该对象属性(点右侧)之间的分隔符。 该字符串按照从左到右的顺序进行评估,支持逐步遍历多个对象属性关系。 我们来看一个示例:

"{Binding Path=Customer.Address.StreetAddress1}"

下面介绍了如何评估此路径:

  1. 数据上下文对象(或相同绑定指定的)中搜索名为“Customer”的属性。
  2. 在“Customer”属性值对应的对象中搜索名为“Address”的属性。
  3. 作为“Address”属性的值的对象搜索名为“StreetAddress1”的属性。

在上述每个步骤中,该值被视为对象。 仅当绑定应用于特定属性时,才会检查结果的类型。 如果“Address”只是一个字符串值,但未公开该字符串的哪个部分是街道地址,则此示例将失败。 通常,绑定指向业务对象中具有已知的、有意设计的信息结构的特定嵌套属性值。

数据绑定属性路径规则

  • 属性路径引用的所有属性都必须在源业务对象中公开。
  • end 属性(路径中最后一个命名属性的属性)必须为公共属性,并且必须可变 – 不能绑定到静态值。
  • 如果此路径用作双向绑定的 路径 信息,则该属性必须是可读/写。

索引器

数据绑定的属性路径可以包括对索引属性的引用。 这样就可以绑定到有序列表/向量或字典/地图。 使用方括号“[]”字符指示索引属性。 这些方括号的内容可以是整数(对于有序列表)或无引号字符串(对于字典)。 您还可以绑定到一个键为整数的字典。 可以在同一路径中使用不同的索引属性,并用点分隔对象属性。

例如,考虑一个包含“团队”(有序列表)的业务对象,其中每个团队都有一个“球员”字典,每位球员都以其姓氏为键。 第二个团队中特定玩家的属性路径示例是:“Teams[1].Players[Smith]”。 (使用 1 表示“Teams”中的第二项,因为列表是从零开始计数的。)

注释

对C++数据源的索引支持有限;有关详细信息 ,请参阅数据绑定

附加属性

属性路径可以包含对附加属性的引用。 由于附加属性的标识名称已包含一个点,因此必须将任何附加属性名称括在括号内,以便该点不被视为对象属性步骤。 例如,指定要将 Canvas.ZIndex 用作绑定路径的字符串是“(Canvas.ZIndex)”。 有关附加属性的详细信息,请参阅 附加属性概述

组合属性路径语法

可以在单个字符串中组合属性路径语法的各种元素。 例如,如果数据源具有此类属性,则可以定义引用索引附加属性的属性路径。

调试绑定属性路径

由于属性路径由绑定引擎解释,并且依赖于可能只有在运行时才提供的信息,因此通常必须调试绑定的属性路径,而不能依赖开发工具中传统的设计时或编译时支持。 在许多情况下,无法解析属性路径的运行时结果是一个空值,没有错误,因为这是绑定解析的按设计回退行为。 幸运的是,Microsoft Visual Studio 提供了调试输出模式,可以隔离指定绑定源无法解析的属性路径的哪个部分。 有关使用此开发工具功能的详细信息,请参阅 数据绑定的“调试”部分

动画目标的属性路径

动画依赖于将依赖属性作为目标,在动画运行时应用动画值。 用于标识动画属性所在对象时,动画会通过元素的名称(x:Name 属性)来识别元素。 通常必须定义一个属性路径,该路径以标识为 Storyboard.TargetName 的对象开头,并以动画应应用的特定依赖属性值结尾。 该属性路径用作 Storyboard.TargetProperty 的值。

有关如何在 XAML 中定义动画的详细信息,请参阅 情节提要动画

简单定向

如果要对目标对象本身上存在的属性进行动画处理,并且该属性的类型可以直接对其应用动画(而不是应用于属性值的子属性),则只需对要进行动画处理的属性命名,而无需任何进一步限定。 例如,如果您将Shape的子类(如Rectangle)作为目标,并向Fill属性应用动画Color,则属性路径可以是“Fill”。

间接属性定位

可以对作为目标对象的子属性的属性进行动画处理。 换句话说,如果目标对象的某个属性是一个对象,并且这个对象也有其自身的属性,则必须定义一个属性路径,说明如何遍历该对象-属性关系。 每当指定要对子属性进行动画处理的对象时,将属性名称括在括号中,并在 typename 中指定属性。propertyname 格式。 例如,若要指定目标对象的 RenderTransform 属性的对象值,请将“(UIElement.RenderTransform)”指定为属性路径中的第一步。 这还不是完整的路径,因为没有动画可以直接应用于 转换 值。 因此,对于此示例,您需要完成该属性路径,以便最终属性属于 Transform 的一个子类,并且可以通过 Double 值进行动画处理:“(UIElement.RenderTransform).(CompositeTransform.TranslateX)”

指定集合中的特定子项

若要在集合属性中指定子项,可以使用数值索引器。 在整数索引值周围使用方括号“[]”字符。 只能引用有序列表,不能引用字典。 由于集合不是可以进行动画处理的值,因此索引器用法永远不能是属性路径中的结束属性。

例如,若要指定要对应用于控件背景属性的 LinearGradientBrush 中的第一个颜色停止颜色进行动画处理,这是属性路径:“(Control.Background)。(GradientBrush.GradientStops)[0].(GradientStop.Color)“. 请注意索引器不是路径中的最后一步,最后一步尤其必须引用集合中项 0 的 GradientStop.Color 属性,才能向其应用 Color 动画值。

对附加属性进行动画处理

这不是一种常见方案,但只要附加属性具有与动画类型匹配的属性值,就可以对附加属性进行动画处理。 由于附加属性的标识名称已包含一个点,因此必须将任何附加属性名称括在括号内,以便该点不被视为对象属性步骤。 例如,要指定要对对象上的 Grid.Row 附加属性进行动画处理的字符串,请使用属性路径“(Grid.Row)”。

注释

对于此示例, Grid.Row 的值是 Int32 属性类型。 因此,无法使用 Double 动画对其进行动画处理。 而是定义具有 DiscreteObjectKeyFrame 组件的 ObjectAnimationUsingKeyFrames,其中 ObjectKeyFrame.Value 设置为整数,例如“0”或“1”。

动画中目标属性路径的属性规则

  • 属性路径的假定起点是由 Storyboard.TargetName 标识的对象。
  • 沿属性路径引用的所有对象和属性都必须是公共的。
  • end 属性(路径中最后一个命名属性的属性)必须是公共的、可读写的,并且是依赖属性。
  • 结束属性必须具有一个属性类型,该属性类型可由一类广泛的动画类型(颜色 动画、 双动画 动画、 ObjectAnimationUsingKeyFrames)进行动画处理。

PropertyPath 类

PropertyPath 类是绑定方案 Binding.Path 的基础属性类型。

大多数情况下,可以在 XAML 中应用 PropertyPath ,而无需使用任何代码。 但在某些情况下,你可能想要使用代码定义 PropertyPath 对象,并在运行时将其分配给属性。

PropertyPath 具有 PropertyPath(String) 构造函数,并且没有默认构造函数。 传递给此构造函数的字符串是使用属性路径语法定义的字符串,如前面所述。 这也是用于将 Path 分配为 XAML 属性的字符串。 PropertyPath 类的另一个 API 是 Path 属性,该属性是只读的。 可以将此属性用作另一个 PropertyPath 实例的构造字符串。