{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} | Self のMode値を生成します。 ターゲット要素は、このバインディングのソースとして使用する必要があります。 これは、要素の 1 つのプロパティを同じ要素の別のプロパティにバインドする場合に便利です。 |
{RelativeSource TemplatedParent} | このバインディングのソースとして適用される ControlTemplate を生成します。 これは、テンプレート レベルでバインドにランタイム情報を適用する場合に便利です。 |
解説
Bindingは、Binding.RelativeSource Binding オブジェクト要素の属性として、または{Binding} マークアップ拡張内のコンポーネントとして設定できます。 このため、2 つの異なる XAML 構文が表示されます。
RelativeSource は、 {Binding} マークアップ拡張に似ています。 これは、それ自体のインスタンスを返し、基本的にコンストラクターに引数を渡す文字列ベースの構築をサポートできるマークアップ拡張です。 この場合、渡される引数は Mode 値です。
Self モードは、要素の 1 つのプロパティを同じ要素の別のプロパティにバインドする場合に便利であり、ElementName バインディングのバリエーションですが、名前付けしてから要素を自己参照する必要はありません。 ある要素のプロパティを同じ要素の別のプロパティにバインドする場合は、プロパティで同じプロパティ型を使用するか、バインドで Converter を使用して値を変換する必要があります。 たとえば、変換せずに Width のソースとして Height を使用できますが、Visibility のソースとして IsEnabled を使用するにはコンバーターが必要です。
次に例を示します。 このRectangleは{Binding} マークアップ拡張を使用してHeightとWidthが常に等しく、正方形としてレンダリングされるようにします。 [高さ] のみが固定値として設定されます。 このRectangle の場合既定のDataContextはではなくnullです。 そのため、データ コンテキスト ソースをオブジェクト自体として確立し (その他のプロパティへのバインドを有効にする)、{Binding} マークアップ拡張の使用法で RelativeSource={RelativeSource Self}
引数を使用します。
<Rectangle
Fill="Orange" Width="200"
Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>
RelativeSource={RelativeSource Self}
のもう 1 つの用途は、オブジェクトの DataContext 自体を設定する方法です。 たとえば、<common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">
など、独自のデータ バインディングのために準備の完了したビュー モデルを既に提供しているカスタム プロパティによって Page クラスが拡張されている SDK のサンプルで、この技法を確認できます。
注 XAML での RelativeSource の使用法には、意図されている使用法、つまり、バインド式の一部として XAML で Binding.RelativeSource の値を設定する方法のみが示されています。 理論的には、値がrelativeSourceであるプロパティを設定する場合は、他の使用法可能です。