{RelativeSource} 标记扩展

提供在运行时对象图中指定相对关系的绑定源的方法。

XAML 属性用法 (自模式)

<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>

XAML 属性用法(TemplatedParent 模式)

<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>

XAML 值

术语 说明
{RelativeSource Self} 生成 SelfMode 值。 目标元素应用作此绑定的源。 这对于将元素的一个属性绑定到同一元素上的另一个属性很有用。
{RelativeSource TemplatedParent} 生成一个作为此绑定的源应用的 ControlTemplate 这对于将运行时信息应用于模板级别的绑定非常有用。

注解

Binding 可以将 Binding.RelativeSource 设置为 Binding 对象元素的属性或 {Binding} 标记扩展中的组件。 这就是为什么显示两种不同的 XAML 语法的原因。

RelativeSource 类似于 {Binding} 标记扩展。 它是一个标记扩展,能够返回其自身的实例,并支持基本将参数传递给构造函数的基于字符串的构造。 在这种情况下,传递的参数是 Mode 值。

Self 模式可用于将元素的一个属性绑定到同一元素上的另一个属性,并且是 ElementName 绑定的变体,但不需要命名,然后自引用元素。 如果将元素的一个属性绑定到同一元素上的另一个属性,则属性必须使用相同的属性类型,或者还必须在 绑定上使用转换器 来转换值。 例如,可以将 Height 用作宽度的源而不进行转换,但需要使用转换器将 IsEnabled 用作 Visibility 的源。

下面是一个示例。 此矩形使用 {Binding} 标记扩展,使其高度宽度始终相等,并呈现为正方形。 仅将 Height 设置为固定值。 对于此矩形,其默认 DataContextnull,而不是为 null。 因此,若要建立数据上下文源作为对象本身(并允许绑定到其其他属性),请使用 RelativeSource={RelativeSource Self} {Binding} 标记扩展用法中的参数。

<Rectangle
  Fill="Orange" Width="200"
  Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>

另一种用途 RelativeSource={RelativeSource Self} 是将对象的 DataContext 设置为自身的方法。 例如,你可能在某些 SDK 示例中看到过此技术,其中使用了已为其自身的数据绑定提供可用的视图模型的自定义属性扩展 Page 类,诸如此类:<common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

请注意,RelativeSourceXAML 用法仅显示其用途:在 XAML 中将 Binding.RelativeSource 的值设置为绑定表达式的一部分。 从理论上讲,如果设置值为 RelativeSource 的属性,则可能会使用其他用法。