添付プロパティ は XAML の概念です。 添付プロパティを使用すると、追加のプロパティと値のペアをオブジェクトに設定できますが、プロパティは元のオブジェクト定義の一部ではありません。 添付プロパティは、通常、所有者型のオブジェクト モデルに従来のプロパティ ラッパーがない特殊な形式の依存関係プロパティとして定義されます。
[前提条件]
依存関係プロパティの基本的な概念を理解し、依存関係プロパティの概要
XAML の添付プロパティ
XAML では、AttachedPropertyProvider.PropertyName
<Canvas>
<Button Canvas.Left="50">Hello</Button>
</Canvas>
注
Canvas.Left を添付プロパティの例として使用しています。使用する理由を完全に説明する必要はありません。
添付プロパティを使用する理由
添付プロパティは、リレーションシップ内の異なるオブジェクトが実行時に情報を相互に通信することを妨げる可能性があるコーディング規則をエスケープする方法です。 各オブジェクトがそのプロパティを取得して設定できるように、共通の基底クラスにプロパティを配置することは確実に可能です。 しかし、最終的にこれを行う必要があるシナリオの膨大な数は、共有可能なプロパティを使用して基底クラスを肥大化します。 数百人の子孫の中で、プロパティを使おうとしているのがたった2人であるケースが発生する可能性もあります。 それは良いクラスの設計ではありません。 これに対処するために、添付プロパティの概念により、オブジェクトは独自のクラス構造で定義されていないプロパティの値を割り当てることができます。 定義クラスは、オブジェクト ツリーにさまざまなオブジェクトが作成された後、実行時に子オブジェクトから値を読み取ることができます。
たとえば、子要素は、添付プロパティを使用して、UI での表示方法を親要素に通知できます。 これは、Canvas.Left 添付プロパティの場合です。 Canvas.Left は、Canvas 自体ではなく、Canvas 要素に含まれる要素に設定されるため、添付プロパティとして作成されます。 次に、使用可能な子要素は、Canvas.Left と Canvas.Top を使用して、Canvas レイアウト コンテナーの親内のレイアウト オフセットを指定します。 添付プロパティを使用すると、基本要素のオブジェクト モデルを乱雑にすることなく動作し、それぞれが可能なレイアウト コンテナーの 1 つだけに適用される多数のプロパティを使用できます。 代わりに、レイアウト コンテナーの多くは、独自の添付プロパティ セットを実装します。
添付プロパティを実装するために、
所有する型で添付プロパティを使用する方法
添付プロパティは任意の XAML 要素 (または基になる DependencyObject) で設定できますが、プロパティの設定によって具体的な結果が生成されたり、値にアクセスされたりすることを自動的に意味することはありません。 添付プロパティを定義する型は、通常、次のいずれかのシナリオに従います。
- 添付プロパティを定義するタイプは、他のオブジェクトとのリレーションシップにおける親オブジェクトです。 子オブジェクトは、添付プロパティの値を設定します。 添付プロパティの所有者の型には、子要素を反復処理し、値を取得し、オブジェクトの有効期間のある時点 (レイアウト アクション、SizeChanged
など) でそれらの値に対して動作する、何らかの生来の動作があります。 - 添付プロパティを定義する型は、可能なさまざまな親要素とコンテンツ モデルの子要素として使用されますが、情報は必ずしもレイアウト情報ではありません。
- 添付プロパティは、別の UI 要素ではなく、サービスに情報を報告します。
これらのシナリオと所有型の詳細については、「カスタム添付プロパティ の「Canvas.Left の詳細」セクションを参照してください。
コード内の添付プロパティ
添付プロパティには、他の依存関係プロパティと同様に、アクセスを簡単に取得および設定するための一般的なプロパティ ラッパーはありません。 これは、添付プロパティが、プロパティが設定されているインスタンスのコード中心オブジェクト モデルの一部であるとは限らないためです。 (一般的ではありませんが、他の型が自己設定できる添付プロパティであり、所有する型に対しても従来のプロパティとして機能するプロパティを定義することができます。)
コードで添付プロパティを設定するには、プロパティ システム API を使用するか、XAML パターン アクセサーを使用するかの 2 つの方法があります。 これらの手法は最終的な結果に関してかなり同等であるため、使用するものはほとんどコーディング スタイルの問題です。
プロパティ システムの使用
Windows ランタイムの添付プロパティは依存関係プロパティとして実装されるため、プロパティ システムによって値を共有依存関係プロパティ ストアに格納できます。 したがって、添付プロパティは、所有するクラスの依存関係プロパティ識別子を公開します。
コードで添付プロパティを設定するには、SetValue メソッドを呼び出し、その添付プロパティの識別子として機能する DependencyProperty フィールドを渡します。 (設定する値も渡します)。
コードで添付プロパティの値を取得するには、GetValue メソッドを呼び出し、識別子として機能する DependencyProperty フィールドをもう一度渡します。
XAML アクセサー パターンの使用
XAML プロセッサは、XAML がオブジェクト ツリーに解析されるときに、添付プロパティ値を設定できる必要があります。 添付プロパティの所有者の型は、「GetPropertyName」と「SetPropertyName」という形式で指定された専用のアクセサーメソッドを実装する必要があります。 これらの専用アクセサー メソッドは、コードで添付プロパティを取得または設定する 1 つの方法でもあります。 コードの観点から見ると、添付プロパティは、プロパティ アクセサーではなくメソッド アクセサーを持つバッキング フィールドに似ています。バッキング フィールドは、明示的に定義する必要はなく、任意のオブジェクトに存在できます。
次の例では、XAML アクセサー API を使用してコードで添付プロパティを設定する方法を示します。 この例では、myCheckBox
は CheckBox クラスのインスタンスです。 最後の行は、実際に値を設定するコードです。その前の行は、インスタンスとその親子関係を確立するだけです。 コメントされていない最後の行は、プロパティ システムを使用する場合の構文です。 コメントされた最後の行は、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);
カスタム添付プロパティ
カスタム添付プロパティを定義する方法のコード例、および添付プロパティを使用するシナリオの詳細については、「カスタム添付プロパティを参照してください。
添付プロパティ参照の特別な構文
添付プロパティ名のドットは、識別パターンの重要な部分です。 構文や状況でドットが他の意味を持つものとして扱う場合、あいまいさがある場合があります。 たとえば、ドットはバインディング パスのオブジェクト モデル トラバーサルとして扱われます。 ほとんどの場合、このようなあいまいさを扱うために、添付プロパティには特別な構文があり、これにより内部のドットが
- 添付プロパティをアニメーションのターゲット パスの一部として指定するには、添付プロパティ名をかっこ ("()") で囲みます (例: "(Canvas.Left)")。 詳細については、「プロパティ パス構文 」を参照してください。
Warnung
Windows ランタイム XAML 実装の既存の制限は、カスタム添付プロパティをアニメーション化できないことです。
- リソース ファイルから の x:Uidへのリソース参照のターゲット プロパティとして添付プロパティを指定するには、特別な構文を使用して、角かっこ ("[]") 内にコードスタイルの完全修飾 として 宣言を挿入し、意図的にスコープを区切ります。 たとえば、
<TextBlock x:Uid="Title" />
要素が存在すると仮定すると、そのインスタンスの Canvas.Top 値を対象とするリソース ファイル内のリソース キーは "Title" です。[using:Windows.UI.Xaml.Controls]Canvas.Top"。 リソース ファイルと XAML の詳細については、「クイック スタート: UI リソースの翻訳」を参照してください。
関連トピック
- カスタム添付プロパティ
- 依存関係プロパティの概要
- XAML を使用してレイアウトを定義する
- クイック スタート: UI リソース の翻訳
- SetValue
- GetValue