次の方法で共有


RelativeSource マークアップ拡張

バインディング マークアップ拡張内で使用する、または XAML で確立された Binding 要素の RelativeSource プロパティを設定するときに、RelativeSource バインディング ソースのプロパティを指定します。

XAML 属性の使用法

<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />

XAML 属性の使用法 (バインディング拡張機能内でネストされた)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />

XAML オブジェクト要素の使用法

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>

-又は-

<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

XAML 値

価値 説明
modeEnumValue 次のいずれか:

- 文字列トークン Self;は、Mode プロパティを Selfに設定して作成された RelativeSource に対応します。
- 文字列トークン TemplatedParent;は、Mode プロパティを TemplatedParentに設定して作成された RelativeSource に対応します。
- 文字列トークン PreviousData;は、Mode プロパティを PreviousDataに設定して作成された RelativeSource に対応します。
- FindAncestor モードの詳細については、以下を参照してください。
FindAncestor 文字列トークン FindAncestor。 このトークンを使用すると、RelativeSource が先祖の種類と必要に応じて先祖レベルを指定するモードになります。 これは、Mode プロパティを FindAncestorに設定して作成された RelativeSource に対応します。
typeName FindAncestor モードに必要です。 AncestorType プロパティを設定する型の名前。
intLevel FindAncestor モードの場合は省略可能です。 先祖レベル (論理ツリーの親方向に向かって評価)。

備考

{RelativeSource TemplatedParent} バインドの使用法は、コントロールの UI とコントロールのロジックの分離のより大きな概念に対処する重要な手法です。 これにより、テンプレート定義内からテンプレート化された親 (テンプレートが適用されているランタイム オブジェクト インスタンス) へのバインドが可能になります。 この場合、TemplateBinding Markup Extension は、実際には次のバインド式の短縮形です: {Binding RelativeSource={RelativeSource TemplatedParent}}TemplateBinding または {RelativeSource TemplatedParent} の両方の使用法は、テンプレートを定義する XAML 内でのみ関連します。 詳細については、「TemplateBinding Markup Extension」を参照してください。

{RelativeSource FindAncestor} は、コントロールが常に特定の先祖型のビジュアル ツリーにあると予想される場合に、コントロール テンプレートまたは予測可能な自己完結型 UI コンポジションで主に使用されます。 たとえば、項目コントロールの項目では、FindAncestor 使用法を使用して、そのアイテム コントロールの親先祖のプロパティにバインドできます。 または、テンプレート内のコントロールコンポジションの一部である要素は、同じコンポジション構造の親要素への FindAncestor バインディングを使用できます。

XAML 構文セクションに示されている FindAncestor モードのオブジェクト要素構文では、2 番目のオブジェクト要素構文は、FindAncestor モード専用に使用されます。 FindAncestor モードでは、AncestorType 値が必要です。 x:Type Markup Extension 検索する先祖の型への参照を使用して、AncestorType を属性として設定する必要があります。 AncestorType 値は、バインド要求が実行時に処理されるときに使用されます。

FindAncestor モードでは、要素ツリーに複数の先祖が存在する可能性がある場合に、オプションのプロパティ AncestorLevel を使用して先祖参照を明確にすることができます。

FindAncestor モードの使用方法の詳細については、「RelativeSource」を参照してください。

{RelativeSource Self} は、インスタンスの 1 つのプロパティが同じインスタンスの別のプロパティの値に依存する必要があり、これらの 2 つのプロパティ間に一般的な依存関係プロパティリレーションシップ (強制型指定など) が既に存在しないシナリオに役立ちます。 オブジェクトに 2 つのプロパティが存在し、値が文字どおり同一 (および同じ型) になることはまれですが、{RelativeSource Self}を持つバインドに Converter パラメーターを適用し、コンバーターを使用してソース型とターゲット型の間で変換することもできます。 {RelativeSource Self} のもう 1 つのシナリオは、MultiDataTriggerの一部です。

たとえば、次の XAML では、Widthに入力される値に関係なく、Rectangle は常に正方形になるように、Rectangle 要素を定義します。<Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} は、データ テンプレート、またはバインディングがデータ ソースとしてコレクションを使用している場合に便利です。 {RelativeSource PreviousData} を使用すると、コレクション内の隣接するデータ項目間のリレーションシップを強調表示できます。 関連する手法は、データ ソース内の現在の項目と前の項目の間に MultiBinding を確立し、そのバインディングのコンバーターを使用して、2 つの項目とそのプロパティの違いを判断することです。

次の例では、アイテム テンプレートの最初の TextBlock に現在の番号が表示されます。 2 番目の TextBlock バインディングは、現在のレコードと、{RelativeSource PreviousData}を使用して以前のデータ レコードを意図的に使用するバインディングという 2 つの Binding 構成要素を持つ MultiBinding です。 次に、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>
</ListBox>

データ バインディングの概念については、ここでは説明しません。データ バインディングの概要参照してください。

WPF XAML プロセッサの実装では、このマークアップ拡張機能の処理は、RelativeSource クラスによって定義されます。

RelativeSource はマークアップ拡張機能です。 マークアップ拡張は通常、リテラル値またはハンドラー名以外の属性値をエスケープする必要があり、特定の型またはプロパティに型コンバーターを配置するよりもグローバルな要件である場合に実装されます。 XAML のすべてのマークアップ拡張では、属性構文で { 文字と } 文字が使用されます。これは、マークアップ拡張機能が属性を処理する必要があることを XAML プロセッサが認識する規則です。 詳細については、「マークアップ拡張機能 WPF XAML」を参照してください。

関連項目