RelativeSource MarkupExtension
指定要在 绑定标记扩展 中使用或者要在 XAML.中创建的 Binding 元素的 RelativeSource 属性指定 RelativeSource 绑定源的属性。
XAML 特性用法
<Binding RelativeSource="{RelativeSource modeEnumValue}" .../>
XAML 特性用法(嵌套在 Binding 扩展内)
<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" .../>
XAML 对象元素用法
<Binding>
<Binding.RelativeSource>
<RelativeSource Mode="modeEnumValue"/>
</Binding.RelativeSource>
</Binding>
- or
<Binding>
<Binding.RelativeSource>
<RelativeSource
Mode="FindAncestor"
AncestorType="{x:Type typeName}"
AncestorLevel="intLevel"
/>
</Binding.RelativeSource>
</Binding>
XAML 值
modeEnumValue |
以下之一:
|
FindAncestor |
字符串标记 FindAncestor。 使用此标记输入一个模式,供 RelativeSource 指定上级类型和可选的上级级别。 它对应于将 Mode 属性设置为 FindAncestor 时创建的 RelativeSource。 |
typeName |
对于 FindAncestor 模式是必需的。 类型的名称,用于填充 AncestorType 属性。 |
intLevel |
对于 FindAncestor 模式是可选的。 上级级别(在逻辑树中向父级方向计算)。 |
备注
{RelativeSource TemplatedParent} 绑定使用是解析分离控件的用户界面和控件的逻辑这一大概念的关键方法。 这使得将从模板定义中绑定到模板化父级(应用模板时的运行时对象实例)。 这种情况下,TemplateBinding 标记扩展 其实是下面的绑定表达式的简写: {Binding RelativeSource={RelativeSource TemplatedParent}}。 TemplateBinding 或 {RelativeSource TemplatedParent} 使用仅在定义模板的 XAML 内部相关。 有关更多信息,请参见TemplateBinding 标记扩展
{RelativeSource FindAncestor} 主要用于控件模板或可预测的独立用户界面组合,在此情况下,控件总是应在某个上级类型的可视化树中。 例如,项控件的项可能使用 FindAncestor 用法绑定到其项控件的父亲以及祖先的属性上。 或者,属于模板中控件组合一部分的元素可使用 FindAncestor 绑定到同一组合结构的父元素。
在 XAML 语法章节显示的 FindAncestor 模式的对象元素语法中,第二个对象元素语法专门用于 FindAncestor 模式。 FindAncestor 模式需要 AncestorType 值。 必须使用对要查找的上级类型的 x:Type 标记扩展引用将 AncestorType 设置为一个特性。 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,名义上有两个Binding 构成要素:当前记录,和通过使用 {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>
本文未从概念上介绍数据绑定;请参见数据绑定概述。
在 WPF XAML 处理器实现中,对此标记扩展的处理由 RelativeSource 类进行定义。
RelativeSource 是标记扩展。 当要求转义特性值应为非文本值或非处理程序名称时,通常会实现标记扩展,相对于只在某些类型或属性上放置类型转换器而言,此要求更具有全局性。 XAML 中的所有标记扩展在其属性语法中都使用 { 和 } 字符,XAML 处理器通过这一约定识别出该属性必须由标记扩展处理。 有关更多信息,请参见标记扩展和 WPF XAML。