更新 : 2007 年 11 月
オブジェクトのプロパティを視覚的に編集できることは、Windows Presentation Foundation (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 を使用できます。
実装できる 4 種類のプロパティ値エディタを次の表に示します。
プロパティ値エディタの種類 |
説明 |
---|---|
シンプル |
1 つのインライン エディタで構成されるプロパティ値エディタ。 |
拡張 |
1 つのインライン エディタと 1 つの拡張エディタで構成されるプロパティ値エディタ。 |
ダイアログ |
1 つのインライン エディタと 1 つのダイアログ ボックスで構成されるプロパティ値エディタ。 |
インフラストラクチャ クラス
インフラストラクチャ クラスは、すべてのプロパティ値エディタ実装に必要です。これらのクラスは、値エディタをホストまたは作成するための主要なインフラストラクチャで構成されます。次の表にインフラストラクチャ クラスを示します。
インフラストラクチャ クラス |
説明 |
---|---|
プロパティの値を表します。 |
|
値エディタの基本クラスです。 |
|
RoutedCommand 型およびそれらのコマンドに使用されるハンドラの既定の実装です。 |
|
ダイアログ ボックス値エディタの抽象基本クラスです。
|
プロパティ値エディタの実装
以下のセクションでは、プロパティ値エディタの実装のさまざまな側面について説明します。
Value、StringValue、および Collection
PropertyValue モデルには、プロパティの値に対応した 3 つのプロパティがあります。PropertyValue の各プロパティを次の表に示します。
PropertyValue プロパティ |
説明 |
---|---|
データのオブジェクト表現。 |
|
表示やシリアル化に使用できる、データの文字列表現。 |
|
データのコレクション表現。 |
StringValue は、表示やシリアル化に使用できるデータの文字列表現です。Value および StringValue には、set 呼び出しがキャッシュされます。
StringValue のキャッシュは、Value が設定されるとフラッシュされます。Value のキャッシュは、ImmediateValue が設定されるとフラッシュされます。したがって、ImmediateValue が設定されると、Value と StringValue の両方のキャッシュがフラッシュされます。
一般的なシナリオとして、プロパティを (ユーザー型として) 設計されたとおりに動的に更新する使い方があります。このとき、StringValue はテキスト エントリにデータ バインドされます。ただし、基になるプロパティは動的テキストが特定の条件を満たすときにのみ設定されます。
PropertyValueEditor の要件
プロパティ値エディタを正しく実装するには、次の要件を満たす必要があります。
インライン エディタ部と拡張エディタ部はそれぞれ単独で使用できるように設計されている必要があります。
プロパティ値エディタに状態を格納しないでください。プロパティ値エディタは状態を持たず、ホスト実装によってキャッシュされたり、複数のプロパティ値に再利用されたりします。
プロパティ値エディタは、一度に 1 つの値エディタ部 (ビュー/インライン/拡張) コントロールのみがアクティブになっていると仮定できません。たとえば、ダイアログ ボックスでは、ビュー部、インライン部、および拡張 UI 部が同時にアクティブになることがあります。
プロパティ値エディタの一部として実装されたコントロールに状態を格納しないでください。値エディタの一部として実装されたコントロールは、1 つのプロパティ値のみにバインドされると仮定できません。コントロールは、別のプロパティ値を変更するためにリサイクルされることがあります。データ モデルが更新された場合は、キャッシュに保存されている情報をフラッシュする必要があります。
プロパティ値エディタの一部として実装されたコントロールは、特定のホスト コントロールや親コントロールについて、一切仮定をすることもできません。唯一使用する通信機構は、DataContext を手段とし、標準コマンドを使用する PropertyValue データ モデルです。