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

プロパティを指定します、RelativeSource内で使用する、バインディング ソースをバインディング マークアップ拡張を設定するとき、または、RelativeSourceのプロパティをBindingXAML に設定されている要素。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; に対応する、RelativeSource使用作成すると、Modeプロパティに設定Selfします。- The string token Self; corresponds to a RelativeSource as created with its Mode property set to Self.
-文字列トークンTemplatedParent; に対応する、RelativeSource使用作成すると、Modeプロパティに設定TemplatedParentします。- The string token TemplatedParent; corresponds to a RelativeSource as created with its Mode property set to TemplatedParent.
-文字列トークンPreviousData; に対応する、RelativeSource使用作成すると、Modeプロパティに設定PreviousDataします。- 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 マークアップ拡張機能。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. 設定する必要がありますAncestorTypeを使用して、属性として、 X:type マークアップ拡張機能検索する先祖の型への参照。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. 値はリテラルと同じです (とは、型指定と同じ) になるように、2 つのプロパティがオブジェクトに存在を適用することもまれですが、Converterパラメーターを持つバインドを{RelativeSource Self}ソース間で変換するコンバーターを使用して、対象の型。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}の一部として、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バインディングが、MultiBinding名目上が 2 つBinding利用者: 現在のレコードとを使用して、前のデータ レコードを意図的に使用するバインディングを{RelativeSource PreviousData}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