プロパティ編集アーキテクチャ
オブジェクトのプロパティを視覚的に編集できることは、WPF Designer for Visual Studio の重要な機能です。 ここでは、WPF デザイナー プロパティ編集システムのアーキテクチャについて説明します。
プロパティのエントリ
PropertyEntry クラスは、プロパティ自身を表します。 PropertyValue クラスは、プロパティの基になる値を表します。
カテゴリ エディター
エンド ユーザーは、カテゴリ エディターを使用して、同じカテゴリに属する複数のプロパティを同時に編集できます。 カテゴリ エディターに関連付けられているプロパティは、[プロパティ] ウィンドウのどこにも表示されません。 そのカテゴリ エディターによって編集されていないプロパティは表示され、編集することができます。 カテゴリ エディターの編集対象にするプロパティをカテゴリから選択できます。
プロパティ値エディター
プロパティ値エディターは、ビジュアルなデザイナーの [プロパティ] ウィンドウで特定の型を表示および編集する方法を定義します。 WPF デザイナー におけるプロパティ値エディターの役割は、System.ComponentModel アーキテクチャにおける UITypeEditor クラスの役割と似ています。 ただし、WPF デザイナー のエディターは、System.ComponentModel および Windows フォームのアーキテクチャに依存しません。
PropertyValueEditor の構成要素を次の表に示します。
プロパティ値エディター部 |
説明 |
---|---|
インライン エディター (ビューとも呼ぶ) |
ホストしている [プロパティ] ウィンドウのビューと物理的に同じ場所でホストされるエディターです。 たとえば、Margin プロパティ エディターがこれに含まれます。 |
拡張エディター |
通常は埋め込まれないエディターです。 このエディターは、System.ComponentModel アーキテクチャのドロップダウン スタイルのエディターと同じです。 たとえば、HorizontalAlignment プロパティ エディターがこれに含まれます。 |
ダイアログ ボックス |
独自のダイアログ ボックスに実装されるエディターです。 たとえば、RowDefinitions プロパティ エディターがこれに含まれます。 |
ビューとインライン エディターには既定値を使用できます。 拡張エディター部を提供するのに、PropertyValueEditor は必要ありません。
各構成要素は、WPF DataTemplate です。 各構成要素はそれぞれ独立しており、単独で使用できます。
ホストしている [プロパティ] ウィンドウからは、ビューとエディターを囲むフレームが提供されます。 これにより、ホストはすべてのエディターに共通のスタイルを提供し、ホストごとに異なるスタイルを用意することができます。 たとえば、Expression Blend と Visual Studio では、[プロパティ] ウィンドウの外観と動作は異なります。
WPF データ バインディングと WPF RoutedCommand オブジェクトの標準セットによって、ホストと PropertyValueEditor 部間の通信機構が提供されます。
最も単純な構成では、値エディター部として、標準 WPF コントロールが含まれる DataTemplate を使用できます。 複雑な構成では、型部として、カスタム コントロールを参照する DataTemplate を使用できます。
実装できる 3 種類のプロパティ値エディターを次の表に示します。
プロパティ値エディターの種類 |
説明 |
---|---|
シンプル |
1 つのインライン エディターで構成されるプロパティ値エディター。 |
拡張 |
1 つのインライン エディターと 1 つの拡張エディターで構成されるプロパティ値エディター。 |
ダイアログ |
1 つのインライン エディターと 1 つのダイアログ ボックスで構成されるプロパティ値エディター。 |
インフラストラクチャ クラス
インフラストラクチャ クラスは、すべてのプロパティ値エディター実装に必要です。 これらのクラスは、値エディターをホストまたは作成するための主要なインフラストラクチャで構成されます。次の表にインフラストラクチャ クラスを示します。
インフラストラクチャ クラス |
説明 |
---|---|
プロパティの値を表します。 |
|
値エディターの基本クラスです。 |
|
RoutedCommand 型およびそれらのコマンドに使用されるハンドラーの既定の実装です。 |
|
ダイアログ ボックス値エディターの抽象基本クラスです。
|
プロパティ値エディターの実装
以下のセクションでは、プロパティ値エディターの実装のさまざまな側面について説明します。
Value、StringValue、および Collection
PropertyValue モデルには、プロパティの値に対応した 3 つのプロパティがあります。 PropertyValue の各プロパティを次の表に示します。
PropertyValue プロパティ |
説明 |
---|---|
データのオブジェクト表現。 |
|
表示やシリアル化に使用できる、データの文字列表現。 |
|
データのコレクション表現。 |
StringValue は、表示やシリアル化に使用できるデータの文字列表現です。 Value および StringValue には、set 呼び出しがキャッシュされます。
StringValue のキャッシュは、Value が設定されるとフラッシュされます。 一般的なシナリオとして、プロパティを (ユーザー型として) 設計されたとおりに動的に更新する使い方があります。このとき、StringValue はテキスト エントリにデータ バインドされます。 ただし、基になるプロパティは動的テキストが特定の条件を満たすときにのみ設定されます。
PropertyValueEditor の要件
プロパティ値エディターを正しく実装するには、次の要件を満たす必要があります。
インライン エディター部と拡張エディター部はそれぞれ単独で使用できるように設計されている必要があります。
プロパティ値エディターに状態を格納しないでください。 プロパティ値エディターは状態を持たず、ホスト実装によってキャッシュされたり、複数のプロパティ値に再利用されたりします。
プロパティ値エディターは、一度に 1 つの値エディター部 (ビュー/インライン/拡張) コントロールのみがアクティブになっていると仮定できません。 たとえば、ダイアログ ボックスでは、ビュー部、インライン部、および拡張 UI 部が同時にアクティブになることがあります。
プロパティ値エディターの一部として実装されたコントロールに状態を格納しないでください。 値エディターの一部として実装されたコントロールは、1 つのプロパティ値のみにバインドされると仮定できません。 コントロールは、別のプロパティ値を変更するためにリサイクルされることがあります。 データ モデルが更新された場合は、キャッシュに保存されている情報をフラッシュする必要があります。
プロパティ値エディターの一部として実装されたコントロールは、特定のホスト コントロールや親コントロールについて、一切仮定をすることもできません。 唯一使用する通信機構は、DataContext を手段とし、標準コマンドを使用する PropertyValue データ モデルです。