このトピックでは、既存の読み取り専用依存関係プロパティや、カスタムの読み取り専用依存関係プロパティを作成するためのシナリオと手法など、読み取り専用の依存関係プロパティについて説明します。
前提 条件
このトピックでは、依存関係プロパティを実装する基本的なシナリオと、カスタム依存関係プロパティにメタデータを適用する方法について理解していることを前提としています。 詳細については、「カスタム依存関係プロパティ」および「依存関係プロパティのメタデータ」を参照してください。
既存の Read-Only 依存関係プロパティ
Windows Presentation Foundation (WPF) フレームワークで定義されている依存関係プロパティの一部は読み取り専用です。 読み取り専用の依存関係プロパティを指定する一般的な理由は、これらは状態の決定に使用する必要があるプロパティですが、その状態は多数の要因の影響を受けますが、プロパティをその状態に設定するだけでは、ユーザー インターフェイスの設計の観点からは望ましくないからです。 たとえば、プロパティ IsMouseOver はマウス入力で決定される表示上の状態に過ぎません。 真のマウス入力を回避してプログラムでこの値を設定しようとすると、予測不能になり、不整合が発生します。
設定できないので、読み取り専用の依存関係プロパティは、依存関係プロパティが通常ソリューションを提供するシナリオの多くに適していません (つまり、データ バインディング、値に直接スタイル設定可能、検証、アニメーション、継承)。 設定できないにもかかわらず、読み取り専用の依存関係プロパティには、プロパティ システムの依存関係プロパティでサポートされる追加機能の一部が引き続き存在します。 残りの最も重要な機能は、読み取り専用の依存関係プロパティをスタイルのプロパティ トリガーとして引き続き使用できることです。 通常の共通言語ランタイム (CLR) プロパティを使用してトリガーを有効にすることはできません。依存関係プロパティである必要があります。 前述の IsMouseOver プロパティは、コントロールのスタイルを定義するのに非常に役立つ可能性があるシナリオの完全な例です。コントロール内の複合要素の背景、前景、または同様のプロパティなどの表示プロパティは、ユーザーがコントロールの定義された領域にマウスを置くと変更されます。 読み取り専用の依存関係プロパティの変更は、プロパティ システム固有の無効化プロセスによって検出および報告することもできます。これは実際には、プロパティ トリガー機能を内部的にサポートします。
カスタム Read-Only 依存関係プロパティの作成
読み取り専用の依存関係プロパティが多くの一般的な依存関係プロパティ のシナリオで機能しない理由については、上記のセクションをお読みください。 ただし、適切なシナリオがある場合は、独自の読み取り専用の依存関係プロパティを作成できます。
読み取り専用の依存関係プロパティを作成するプロセスの多くは、「カスタム依存関係プロパティの と 依存関係プロパティ の実装」トピックで説明されているのと同じです。 次の 3 つの重要な違いがあります。
プロパティを登録するときは、プロパティの登録に通常の Register メソッドではなく、RegisterReadOnly メソッドを呼び出します。
CLR の "ラッパー" プロパティを実装する場合は、ラッパーにもセット実装がないことを確認します。そのため、公開するパブリック ラッパーの読み取り専用状態に不整合が生じないようにします。
読み取り専用登録によって返されるオブジェクトは、DependencyPropertyではなく DependencyPropertyKey。 このフィールドはメンバーとして保存する必要がありますが、通常は型のパブリックメンバーにしない方がよいでしょう。
読み取り専用の依存プロパティを支えるプライベートフィールドまたは値は、もちろん、任意のロジックを適用することで完全に書き込むことができます。 ただし、プロパティを最初に設定するか、ランタイム ロジックの一部としてプロパティを設定する最も簡単な方法は、プロパティ システムを回避してプライベート バッキング フィールドを直接設定するのではなく、プロパティ システムの API を使用することです。 特に、DependencyPropertyKey型のパラメーターを受け取る SetValue のシグネチャがあります。 アプリケーション ロジック内でプログラムによってこの値を設定する方法と場所は、依存関係プロパティを初めて登録したときに作成された DependencyPropertyKey に対するアクセスを設定する方法に影響します。 このロジックをすべてクラス内で処理する場合は、プライベートにするか、アセンブリの他の部分から設定する必要がある場合は、内部で設定できます。 1 つの方法は、関連するイベントのクラス イベント ハンドラー内で SetValue を呼び出し、格納されているプロパティ値を変更する必要があることをクラス インスタンスに通知することです。 もう 1 つの方法は、登録時にそれらのプロパティのメタデータの一部として、ペアの PropertyChangedCallback と CoerceValueCallback コールバックを使用して依存関係プロパティを結び付ける方法です。
DependencyPropertyKey はプライベートであり、コードの外部にあるプロパティ システムによって伝達されないため、読み取り専用の依存関係プロパティは、読み取り/書き込み依存関係プロパティよりもセキュリティを設定する方が優れています。 読み取り/書き込み依存関係プロパティの場合、識別フィールドは明示的または暗黙的にパブリックであるため、プロパティは広く設定できます。 詳細については、依存関係プロパティのセキュリティを参照してください。
関連項目
.NET Desktop feedback