相对源标记扩展

指定绑定源的属性,以供在绑定标记扩展中使用,或在设置Binding元素在 XAML 中建立的RelativeSource属性时使用。

XAML 属性用法

<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />

XAML 属性用法(嵌套在绑定扩展中)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />

XAML 对象元素用法

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>

-或-

<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

XAML 值

价值 DESCRIPTION
modeEnumValue 以下之一:

- 字符串标记 Self 对应于一个 RelativeSource,其 Mode 属性设置为 Self 时创建的。
- 字符串标记 TemplatedParent 对应于一个其 Mode 属性设置为 TemplatedParentRelativeSource
- 字符串标记 PreviousData 对应一个 RelativeSource,其属性 Mode 设置为 PreviousData
- 请参阅下文了解有关FindAncestor模式的信息。
FindAncestor 字符串标记 FindAncestor。 使用此令牌,您可以进入一种模式,其中 RelativeSource 指定上级类型,并且可以选择指定上级级别。 这对应于创建时 RelativeSource 的属性 Mode 设置为 FindAncestor.
typeName 对于FindAncestor模式是必需的。 填充 AncestorType 属性的类型的名称。
intLevel FindAncestor模式是可选的。 祖先级别(在逻辑树中向父方向评估)。

注解

{RelativeSource TemplatedParent} 绑定用法是一种关键技术,用于解决控件 UI 和控件逻辑分离的更大概念。 这允许从模板定义内部绑定到模板化父级(应用模板的运行时对象实例)。 在这种情况下,TemplateBinding 标记扩展实际上是以下绑定表达式的简写: {Binding RelativeSource={RelativeSource TemplatedParent}} TemplateBinding{RelativeSource TemplatedParent} 用法仅与定义模板的 XAML 相关。 有关详细信息,请参阅 TemplateBinding 标记扩展

{RelativeSource FindAncestor} 主要用于控件模板或可预测的自包含用户界面组合,适用于控件始终预计位于特定祖先类型的可视化树中的情况。 例如,某个项控件中的项可能会使用 FindAncestor 用法来绑定到其父级控件的属性。 或者,作为模板中控件构成一部分的元素可以使用 FindAncestor 绑定到同一构成结构中的父元素。

在 XAML 语法部分中显示的 FindAncestor 模式的对象元素语法中,第二个对象元素语法专门用于 FindAncestor 模式。 FindAncestor 模式需要一个 AncestorType 值。 必须将AncestorType设置为属性,并使用x:Type 标记扩展引用来查找需要的上级类型。 在 AncestorType 运行时处理绑定请求时,将使用该值。

对于 FindAncestor 模式,可选属性 AncestorLevel 有助于消除上级查找的歧义,在这种情况下,元素树中可能存在该类型的多个上级。

有关如何使用 FindAncestor 模式的详细信息,请参阅 RelativeSource

{RelativeSource Self} 对于实例的一个属性应依赖于同一实例的另一个属性的值,并且这两个属性之间不存在常规依赖属性关系(如强制)的情况,则非常有用。 尽管一个对象上很少有两个属性具有字面相同的值(并且类型相同),但你也可以将Converter参数应用于包含{RelativeSource Self}的绑定,并使用转换器在源类型和目标类型之间进行转换。 另一种情况是{RelativeSource Self}作为MultiDataTrigger的一部分。

例如,以下 XAML 定义一个 Rectangle 元素,以便无论输入 Width什么值,该 Rectangle 元素始终是一个正方形: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} 在数据模板中或绑定使用集合作为数据源时非常有用。 可用于 {RelativeSource PreviousData} 突出显示集合中相邻数据项之间的关系。 相关技术是在数据源中的当前项和以前的项之间建立关系 MultiBinding ,并使用该绑定上的转换器来确定这两个项与其属性之间的差异。

在以下示例中,项模板中的第一个 TextBlock 显示当前数字。 第二个TextBlock绑定名义上具有两个成分的MultiBinding:当前记录,以及通过使用{RelativeSource PreviousData}故意使用以前数据记录的绑定。 然后,MultiBinding 上的转换器计算差异并将其返回给绑定。

<ListBox Name="fibolist">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding}"/>
            <TextBlock>, difference = </TextBlock>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource DiffConverter}">
                            <Binding/>
                            <Binding RelativeSource="{RelativeSource PreviousData}"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

此处未介绍将数据绑定描述为概念,请参阅 数据绑定概述

在 WPF XAML 处理器实现中,此标记扩展的处理由 RelativeSource 类定义。

RelativeSource 是标记扩展。 当要求转义特性值应为非文本值或非处理程序名称时,通常会实现标记扩展,相对于只在某些类型或属性上放置类型转换器而言,此需求更具有全局性。 XAML 中的所有标记扩展都使用{}其属性语法中的字符,这是 XAML 处理器识别标记扩展必须处理该属性的约定。 有关详细信息,请参阅 标记扩展和 WPF XAML

另请参阅