{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 値を生成します。 ターゲット要素をこのバインドのソースとして使う必要があります。 要素の 1 つのプロパティを同じ要素の別のプロパティにバインドする場合に便利です。
{RelativeSource TemplatedParent} このバインドのソースとして適用される ControlTemplate を生成します。 ランタイム情報をテンプレート レベルでバインドに適用する場合に便利です。

注釈

Binding では、Binding オブジェクト要素の属性または {Binding} マークアップ拡張内のコンポーネントとして Binding.RelativeSource を設定できます。 これが、2 つの異なる XAML 構文が示されている理由です。

RelativeSource{Binding} マークアップ拡張に似ています。 具体的には、自分自身のインスタンスを返すことができ、基本的に引数をコンストラクターに渡す文字列ベースの構築をサポートできるマークアップ拡張機能であるという点です。 この場合、渡される引数は Mode 値になります。

Self モードは、要素の 1 つのプロパティを同じ要素の別のプロパティにバインドする場合に便利です。これは、要素の名前の指定の後に自己参照を必要としない、ElementName バインドの 1 つのバリエーションです。 要素の 1 つのプロパティを同じ要素の別のプロパティにバインドする場合、プロパティで同じプロパティの型を使うか、またはバインドに対して Converter を使って値を変換する必要があります。 たとえば、Height は変換せずに Width のソースとして使用できますが、Visibility のソースとして IsEnabled を使う場合には、コンバーターが必要です。

次に例を示します。 この RectangleHeightWidth が常に等しく、正方形として表示されるように {Binding} マークアップ拡張 を使います。 Height のみが固定値として設定されます。 この Rectangle の既定のDataContextこれではなく null です。 そこで、データ コンテキストのソースをオブジェクト自体にするために (そして他のプロパティにバインドできるようにするために)、{Binding} マークアップ拡張の使用時に RelativeSource={RelativeSource Self} 引数を使います。

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

のもう 1 つの用途 RelativeSource={RelativeSource Self} は、オブジェクトの DataContext をそれ自体に設定する方法です。 たとえば、<common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"> など、独自のデータ バインディングのために準備の完了したビュー モデルを既に提供しているカスタム プロパティによって Page クラスが拡張されている SDK のサンプルで、この技法を確認できます。

XAML での RelativeSource の使用法には、意図されている使用法、つまり、バインド式の一部として XAML で Binding.RelativeSource の値を設定する方法のみが示されています。 ただし、値が RelativeSource のプロパティを設定する場合は、理論的にそれ以外の使用法も可能です。