添付プロパティの概要

添付プロパティは、XAML の概念です。 添付プロパティを使用すると、追加のプロパティと値のペアをオブジェクトに設定できますが、プロパティは元のオブジェクト定義の一部ではありません。 添付プロパティは、通常、所有者型のオブジェクト モデルに従来のプロパティ ラッパーがない特殊な形式の依存関係プロパティとして定義されます。

前提条件

依存関係プロパティの基本的な概念を理解し、 Dependency プロパティの概要を読み取っていることを前提としています

XAML での添付プロパティ

XAML では、構文 AttachedPropertyProvider.PropertyName を使用して添付プロパティを設定します。 XAML で Canvas.Left を設定する方法の例を次に示します。

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Note

ここでは、添付プロパティの一例として Canvas.Left を使っていますが、その理由を全部説明しているわけではありません。 Canvas.Leftの目的とCanvasがレイアウトの子を処理する方法の詳細については、Canvasリファレンス トピックまたは XAML を使用した Define レイアウトを参照してください。

添付プロパティを使用する理由

添付プロパティは、リレーションシップ内の異なるオブジェクトが実行時に情報を相互に通信することを妨げる可能性があるコーディング規則をエスケープする方法です。 各オブジェクトがそのプロパティを取得して設定できるように、共通の基底クラスにプロパティを配置することは確実に可能です。 しかし、最終的にこれを行う必要があるシナリオの膨大な数は、共有可能なプロパティを使用して基底クラスを肥大化します。 プロパティを使用しようとしている子孫の数百人が 2 人しかない場合も発生する可能性があります。 それは良いクラスの設計ではありません。 これに対処するために、添付プロパティの概念により、オブジェクトは独自のクラス構造で定義されていないプロパティの値を割り当てることができます。 定義クラスは、オブジェクト ツリーにさまざまなオブジェクトが作成された後、実行時に子オブジェクトから値を読み取ることができます。

たとえば、子要素は、添付プロパティを使用して、UI での表示方法を親要素に通知できます。 これは、 Canvas.Left 添付プロパティの場合です。 Canvas.Left は、Canvas 自体ではなく、Canvas 要素内に含まれる要素に設定されるため、添付プロパティとして作成されます。 次に、使用可能な子要素は、 Canvas.LeftCanvas.Top を使用して、 Canvas レイアウト コンテナーの親内のレイアウト オフセットを指定します。 添付プロパティを使用すると、基本要素のオブジェクト モデルを乱雑にすることなく動作し、それぞれが可能なレイアウト コンテナーの 1 つだけに適用される多数のプロパティを使用できます。 代わりに、レイアウト コンテナーの多くは、独自の添付プロパティ セットを実装します。

添付プロパティを実装するために、Canvas クラスは、Canvas.LeftProperty という名前の静的DependencyProperty フィールドを定義します。 次に、 Canvas は、添付プロパティのパブリック アクセサーとして SetLeft メソッドと GetLeft メソッドを提供し、XAML 設定と実行時値アクセスの両方を有効にします。 XAML および依存関係プロパティ システムの場合、この API のセットは、添付プロパティに対して特定の XAML 構文を有効にし、その値を依存関係プロパティ ストアに格納するパターンを満たします。

所有する型で添付プロパティを使用する方法

添付プロパティは任意の XAML 要素 (または基になる DependencyObject) で設定できますが、プロパティの設定によって具体的な結果が生成されたり、値にアクセスされたりすることを自動的に意味するわけではありません。 添付プロパティを定義する型は、通常、次のいずれかのシナリオに従います。

  • 添付プロパティを定義する型は、他のオブジェクトのリレーションシップの親です。 子オブジェクトは、添付プロパティの値を設定します。 添付プロパティの所有者型には、子要素を反復処理し、値を取得し、オブジェクトの有効期間のある時点 (レイアウト アクション、 SizeChanged など) でそれらの値に対して動作する、何らかの生来の動作があります。
  • 添付プロパティを定義する型は、さまざまな可能な親要素と conテント モードls の子要素として使用されますが、情報は必ずしもレイアウト情報であるとは限りません。
  • 添付プロパティは、別の UI 要素ではなく、サービスに情報を報告します。

これらのシナリオと所有型の詳細については、「 Custom 添付プロパティ」の「Canvas.Left の詳細」セクションを参照してください。

コードでの添付プロパティ

添付プロパティには、他の依存関係プロパティと同様に、アクセスを簡単に取得および設定するための一般的なプロパティ ラッパーはありません。 これは、添付プロパティが、プロパティが設定されているインスタンスのコード中心オブジェクト モデルの一部であるとは限らないためです。 (一般的ではありませんが、他の型が自身で設定できる添付プロパティであり、所有する型に対する従来のプロパティ使用法を持つプロパティを定義することは、一般的ではありません)。

コードで添付プロパティを設定するには、プロパティ システム API を使用するか、XAML パターン アクセサーを使用するかの 2 つの方法があります。 これらの手法は最終的な結果に関してかなり同等であるため、使用するものはほとんどコーディング スタイルの問題です。

プロパティ システムの使用

Windows ランタイムの添付プロパティは依存関係プロパティとして実装されるため、プロパティ システムによって値を共有の依存関係プロパティ ストアに格納できます。 したがって、添付プロパティは、所有するクラスの依存関係プロパティ識別子を公開します。

コードで添付プロパティを設定するには、 SetValue メソッドを呼び出し、その添付プロパティの識別子として機能する DependencyProperty フィールドを渡します。 (設定する値も渡します)。

コードで添付プロパティの値を取得するには、 GetValue メソッドを呼び出し、識別子として機能する DependencyProperty フィールドをもう一度渡します。

XAML アクセサー パターンの使用

XAML プロセッサは、XAML がオブジェクト ツリーに解析されるときに、添付プロパティ値を設定できる必要があります。 添付プロパティの所有者型は、 GetPropertyName および SetPropertyName の形式で指定された専用アクセサー メソッドを実装する必要があります。 これらの専用アクセサー メソッドは、コードで添付プロパティを取得または設定する 1 つの方法でもあります。 コードの観点から見ると、添付プロパティは、プロパティ アクセサーではなくメソッド アクセサーを持つバッキング フィールドに似ています。バッキング フィールドは、明示的に定義する必要はなく、任意のオブジェクトに存在できます。

次の例では、XAML アクセサー API を使用してコードで添付プロパティを設定する方法を示します。 この例では、 myCheckBoxCheckBox クラスのインスタンスです。 最後の行は、実際に値を設定するコードです。その前の行は、インスタンスとその親子関係を確立するだけです。 コメントされていない最後の行は、プロパティ システムを使用する場合の構文です。 コメントされた最後の行は、XAML アクセサー パターンを使用する場合の構文です。

    Canvas myC = new Canvas();
    CheckBox myCheckBox = new CheckBox();
    myCheckBox.Content = "Hello";
    myC.Children.Add(myCheckBox);
    myCheckBox.SetValue(Canvas.TopProperty,75);
    //Canvas.SetTop(myCheckBox, 75);
    Dim myC As Canvas = New Canvas()
    Dim myCheckBox As CheckBox= New CheckBox()
    myCheckBox.Content = "Hello"
    myC.Children.Add(myCheckBox)
    myCheckBox.SetValue(Canvas.TopProperty,75)
    ' Canvas.SetTop(myCheckBox, 75)
Canvas myC;
CheckBox myCheckBox;
myCheckBox.Content(winrt::box_value(L"Hello"));
myC.Children().Append(myCheckBox);
myCheckBox.SetValue(Canvas::TopProperty(), winrt::box_value(75));
// Canvas::SetTop(myCheckBox, 75);
    Canvas^ myC = ref new Canvas();
    CheckBox^ myCheckBox = ref new CheckBox();
    myCheckBox->Content="Hello";
    myC->Children->Append(myCheckBox);
    myCheckBox->SetValue(Canvas::TopProperty,75);
    // Canvas::SetTop(myCheckBox, 75);

カスタム添付プロパティ

カスタム添付プロパティを定義する方法のコード例、および添付プロパティを使用するシナリオの詳細については、「 Custom 添付プロパティを参照してください。

添付プロパティ参照の特別な構文

添付プロパティ名のドットは、識別パターンの重要な部分です。 構文や状況でドットが他の意味を持つものとして扱う場合、あいまいさがある場合があります。 たとえば、ドットはバインディング パスのオブジェクト モデル トラバーサルとして扱われます。 このようなあいまいさが関係するほとんどの場合、添付プロパティには特別な構文があります。これにより、内部ドットを owner. として解析できます。プロパティ 添付プロパティの区切り記号。

  • 添付プロパティをアニメーションのターゲット パスの一部として指定するには、添付プロパティ名をかっこ ("()") で囲みます (例: "(Canvas.Left)")。 詳しくは、「Property-path 構文」をご覧ください。

警告

ただし、Windows ランタイム XAML 実装の制限があるため、カスタム添付プロパティをアニメーション化することはできません。

  • 添付プロパティをリソース ファイルから x:Uid へのリソース参照のターゲット プロパティとして指定するには、コードスタイルの完全に修飾された using: 宣言を角かっこ ("[]") で囲む特別な構文を使って、故意にスコープ ブレークを作成します。 たとえば、<TextBlock x:Uid="Title" /> という要素が存在する場合、そのインスタンスの Canvas.Top 値をターゲットとするリソース ファイル内のリソース キーは、"Title.[using:Windows.UI.Xaml.Controls]Canvas.Top" となります。 リソース ファイルと XAML の詳細については、「 Quickstart: UI リソースの翻訳」を参照してください。