RelativeSource のマークアップ拡張機能RelativeSource MarkupExtension

バインディングマークアップ拡張機能内で使用されるか、XAML で確立された Binding 要素の RelativeSource プロパティを設定するときに、RelativeSource バインディングソースのプロパティを指定します。Specifies properties of a RelativeSource binding source, to be used within a Binding Markup Extension, or when setting the RelativeSource property of a Binding element established in XAML.

XAML 属性の使用方法XAML Attribute Usage

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

XAML 属性の使用方法 (バインディング拡張内で入れ子にした場合)XAML Attribute Usage (nested within Binding extension)

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

XAML オブジェクト要素の使用方法XAML Object Element Usage

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

-または--or-

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

XAML 値XAML Values

modeEnumValue 次のいずれかになります。One of the following:

-文字列トークン Self;Mode プロパティを Selfに設定して作成された RelativeSource に対応します。- The string token Self; corresponds to a RelativeSource as created with its Mode property set to Self.
-文字列トークン TemplatedParent;Mode プロパティを TemplatedParentに設定して作成された RelativeSource に対応します。- The string token TemplatedParent; corresponds to a RelativeSource as created with its Mode property set to TemplatedParent.
-文字列トークン PreviousData;Mode プロパティを PreviousDataに設定して作成された RelativeSource に対応します。- The string token PreviousData; corresponds to a RelativeSource as created with its Mode property set to PreviousData.
-FindAncestor モードの詳細については、以下を参照してください。- See below for information on FindAncestor mode.
FindAncestor 文字列トークン FindAncestorThe string token FindAncestor. このトークンを使用すると、RelativeSource によって先祖の型およびオプションで先祖レベルを指定するモードになります。Using this token enters a mode whereby a RelativeSource specifies an ancestor type and optionally an ancestor level. これは、RelativeSource プロパティが Mode に設定された状態で作成された FindAncestor に対応します。This corresponds to a RelativeSource as created with its Mode property set to FindAncestor.
typeName FindAncestor モードで必要です。Required for FindAncestor mode. AncestorType プロパティに指定する型の名前。The name of a type, which fills the AncestorType property.
intLevel FindAncestor モードのオプションです。Optional for FindAncestor mode. 論理ツリー内で親の方向に向けて数えた先祖レベル。An ancestor level (evaluated towards the parent direction in the logical tree).

RemarksRemarks

{RelativeSource TemplatedParent} バインディングの使用法は、コントロールの UI とコントロールのロジックを分離するという大きな概念に対処する重要な手法です。{RelativeSource TemplatedParent} binding usages are a key technique that addresses a larger concept of the separation of a control's UI and a control's logic. これによって、テンプレートが適用される親 (テンプレートが適用されるランタイム オブジェクト インスタンス) へのバインディングをテンプレート定義内から行うことができます。This enables binding from within the template definition to the templated parent (the run time object instance where the template is applied). この場合、 TemplateBinding マークアップ拡張機能は実際には、次のバインディング式の短縮形になります。 {Binding RelativeSource={RelativeSource TemplatedParent}}For this case, the TemplateBinding Markup Extension is in fact a shorthand for the following binding expression: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding または {RelativeSource TemplatedParent} の使用は、どちらもテンプレートを定義する XAML 内でのみ関連します。TemplateBinding or {RelativeSource TemplatedParent} usages are both only relevant within the XAML that defines a template. 詳細については、「 TemplateBinding Markup Extension」を参照してください。For more information, see TemplateBinding Markup Extension.

{RelativeSource FindAncestor} は、主にコントロールテンプレートまたは予測可能な自己完結型 UI コンポジションで使用されます。この場合、コントロールは常に特定の先祖型のビジュアルツリー内にあると想定されます。{RelativeSource FindAncestor} is mainly used in control templates or predictable self-contained UI compositions, for cases where a control is always expected to be in a visual tree of a certain ancestor type. たとえば、項目コントロールの各項目は FindAncestor を使用して、その項目コントロールの親先祖のプロパティにバインドすることができます。For example, items of an items control might use FindAncestor usages to bind to properties of their items control parent ancestor. または、テンプレート内のコントロール合成に参加している要素は、同じ合成体系の親要素に対して FindAncestor バインディングを使用できます。Or, elements that are part of control composition in a template can use FindAncestor bindings to the parent elements in that same composition structure.

XAML 構文のセクションに示した FindAncestor モードのオブジェクト要素構文では、2 番目のオブジェクト要素構文は FindAncestor モード向けに使用されます。In the object element syntax for FindAncestor mode shown in the XAML Syntax sections, the second object element syntax is used specifically for FindAncestor mode. FindAncestor モードでは、AncestorType 値が必要です。FindAncestor mode requires an AncestorType value. 検索する先祖の型へのX:Type マークアップ拡張機能の参照を使用して、属性として AncestorType を設定する必要があります。You must set AncestorType as an attribute using an x:Type Markup Extension reference to the type of ancestor to look for. AncestorType 値は、実行時にバインディング要求を処理する際に使用されます。The AncestorType value is used when the binding request is processed at run-time.

FindAncestor モードでは、オプションの AncestorLevel プロパティは、要素ツリー内に型の先祖が複数存在する可能性がある場合に、先祖の検索のあいまいさを解消するのに役立ちます。For FindAncestor mode, the optional property AncestorLevel can help disambiguate the ancestor lookup in cases where there is possibly more than one ancestor of that type existing in the element tree.

FindAncestor モードの使用方法の詳細については、「RelativeSource」を参照してください。For more information on how to use the FindAncestor mode, see RelativeSource.

{RelativeSource Self} は、インスタンスの1つのプロパティが同じインスタンスの別のプロパティの値に依存する必要があり、これら2つのプロパティの間には、一般的な依存関係プロパティの関係 (強制型変換など) が既に存在しない場合に便利です。{RelativeSource Self} is useful for scenarios where one property of an instance should depend on the value of another property of the same instance, and no general dependency property relationship (such as coercion) already exists between those two properties. 1つのオブジェクトに2つのプロパティが存在することはめったにありませんが、値が文字どおり同じであり、同じように型指定されている場合は、{RelativeSource Self}を持つバインディングに Converter パラメーターを適用し、コンバーターを使用してソースとターゲットの間で変換を行うこともできます。な.Although it is rare that two properties exist on an object such that the values are literally identical (and are identically typed), you can also apply a Converter parameter to a binding that has {RelativeSource Self}, and use the converter to convert between source and target types. {RelativeSource Self} のもう1つのシナリオは、MultiDataTriggerの一部です。Another scenario for {RelativeSource Self} is as part of a MultiDataTrigger.

たとえば、Rectangle という XAML は、Width 要素を定義します。Rectangle にどのような値が入力されても、<Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../> は常に正方形となります。For example, the following XAML defines a Rectangle element such that no matter what value is entered for Width, the Rectangle is always a square: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} は、データテンプレートで、またはバインディングがデータソースとしてコレクションを使用する場合に便利です。{RelativeSource PreviousData} is useful either in data templates, or in cases where bindings are using a collection as the data source. {RelativeSource PreviousData} を使用すると、コレクション内の隣接するデータ項目間のリレーションシップを強調表示できます。You can use {RelativeSource PreviousData} to highlight relationships between adjacent data items in the collection. これと関連して、データ ソース内の現在の項目と直前の項目との間に MultiBinding を確立し、そのバインディング上のコンバーターを使用して、2 つの項目 (およびそれらのプロパティ) 間の相違を特定する手法もあります。A related technique is to establish a MultiBinding between the current and previous items in the data source, and use a converter on that binding to determine the difference between the two items and their properties.

次の例の項目テンプレートに出現する 1 つ目の TextBlock は、現在の数値を表示します。In the following example, the first TextBlock in the items template displays the current number. 2番目の TextBlock バインディングは、とに Binding 2 つの構成要素 (現在のレコード) と、{RelativeSource PreviousData}を使用して前のデータレコードを意図的に使用するバインディングを持つ MultiBinding です。The second TextBlock binding is a MultiBinding that nominally has two Binding constituents: the current record, and a binding that deliberately uses the previous data record by using {RelativeSource PreviousData}. MultiBinding 上のコンバーターが、両者の差を計算し、バインディングに返します。Then, a converter on the MultiBinding calculates the difference and returns it to the binding.

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

データバインディングの概念については、ここでは説明しません。「データバインディングの概要」を参照してください。Describing data binding as a concept is not covered here, see Data Binding Overview.

WPFWPF XAML プロセッサの実装では、このマークアップ拡張機能の処理は RelativeSource クラスによって定義されます。In the WPFWPF XAML processor implementation, the handling for this markup extension is defined by the RelativeSource class.

RelativeSource はマークアップ拡張機能です。RelativeSource is a markup extension. 一般にマークアップ拡張機能を実装するのは、属性値をリテラル値やハンドラー名以外にエスケープする要件が存在し、その要件の適用範囲がグローバルで、特定の型やプロパティに型コンバーターを適用するだけにとどまらない場合です。Markup extensions are typically implemented when there is a requirement to escape attribute values to be other than literal values or handler names, and the requirement is more global than just putting type converters on certain types or properties. XAML のすべてのマークアップ拡張は、属性構文で {} 文字を使用します。これは、マークアップ拡張機能が属性を処理する必要があることを XAML プロセッサが認識する規則です。All markup extensions in XAML use the { and } characters in their attribute syntax, which is the convention by which a XAML processor recognizes that a markup extension must process the attribute. 詳細については、「マークアップ拡張機能」および「WPF XAML」を参照してください。For more information, see Markup Extensions and WPF XAML.

関連項目See also