{RelativeSource} 标记扩展

提供一种方式,在运行时对象图中以相对关系形式指定绑定来源。

XAML 属性使用方法(Self 模式)

<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 绑定上的一个变体,但不需要命名和自引用元素。 如果将元素的一个属性绑定到相同元素上的另一个属性,那么两个属性都必须使用相同的属性类型,或者你还必须在绑定上使用 Converter 来转换这些值。 例如,可以使用 Height 作为 Width 的源而不进行转换,但是你将需要一个转换器来将 IsEnabled 用作 Visibility 的源。

示例如下。 此 Rectangle 使用 {Binding} 标记扩展,以便 HeightWidth 始终相等,并以正方形形式呈现它。 仅将 Height 设置为固定值。 对于此 Rectangle,其默认 DataContextnull,而不是 this。 因此,若要创建将成为对象本身的数据上下文源(并支持绑定到它的其他属性),我们使用 {Binding} 标记扩展用法中的 RelativeSource={RelativeSource Self} 参数。

<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}}">

注意RelativeSource 的 XAML 用法仅显示它应有的用法:作为绑定表达式的一部分,在 XAML 中设置 Binding.RelativeSource 的值。 在理论上,如果将一个属性的值设置为 RelativeSource,也可能还有其他用法。