次の方法で共有


RelativeSource マークアップ拡張

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

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; は、RelativeSource プロパティを Mode に設定して作成されたSelfに対応します。
- 文字列トークン TemplatedParent; は、RelativeSource プロパティを Mode に設定して作成されたTemplatedParentに対応します。
- 文字列トークン PreviousData; は、RelativeSource プロパティを Mode に設定して作成されたPreviousDataに対応します。
- FindAncestor モードの詳細については、以下を参照してください。
FindAncestor 文字列トークン FindAncestor。 このトークンを使用すると、 RelativeSource が先祖の種類と必要に応じて先祖レベルを指定するモードになります。 これは、RelativeSource プロパティを Mode に設定して作成されたFindAncestorに対応します。
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 mode には AncestorType 値が必要です。 AncestorTypeを属性として設定するには、検索する先祖の型への x:Type Markup Extension 参照を使用する必要があります。 AncestorType値は、バインド要求が実行時に処理されるときに使用されます。

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

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

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

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

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

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

こちらも参照ください