指定绑定源的属性,以供在绑定标记扩展中使用,或在设置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 属性设置为 TemplatedParent 的 RelativeSource。- 字符串标记 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。