DependencyObjectおよびDependencyPropertyへの依存
-
03-07-2019 - |
質問
Silverlightアプリケーションを構築していますが、前回からの注意点の1つは、Silverlight / WPFの方法で何かを行う必要がある場合、オブジェクトをDependecyObjectとしてモデル化し、DependencyPropertyを使用する必要があることでした
このモデルはかなり面倒で、使用するクラスの半分に静的フィールドと初期化子が必要なので、DependencyObjectの代わりに古き良きイベント駆動型(観測者パターン?)を使用することをお勧めしますか?
コードの肥大化とボイラープレートを最小限に抑えることを目指しています(嫌いです)。Silverlight/ WPFの経験がある人がDependencyObjectとDependencyPropertyの使用を最小限に抑えるためのヒント/テクニックを持っているかどうかを知りたいですか?
これは良いアイデアですか?
解決
実際、SilverlightではDependencyObjectsを継承できないため、代わりにINotifyPropertyChangedを実装する必要があります(そして、そうする必要があります)。
INotifyPropertyChangedの実装には、DependencyObjects(このDOを簡略化して簡単にする)やDependencyProperties(DP)を使用するよりも多くの利点があります。
- これはより軽量です
- オブジェクトをより自由にモデリングできます
- 簡単にシリアル化できます
- 必要に応じてイベントを発生させることができます。これは、特定のシナリオで役立ちます。たとえば、1つのUI操作のみで複数の変更をバンドルする場合、またはデータがなくてもイベントを発生させる必要がある場合変更(強制的に再描画...)
一方、WPFでDOを継承することには次の利点があります:
- 特に初心者向けに実装しやすい。
- (ほとんど)無料でコールバックメカニズムを取得し、プロパティ値が変更されたときに通知を受けることができます
- プロパティの最大値、最小値、現在値のルールを定義できる強制メカニズムを取得します。
その他の考慮事項がありますが、これらが主なものです。
DPはコントロールに優れている(そしてSilverlightでもカスタムDPを使用してCustomControlを実装できる)が、データオブジェクトの場合はINotifyPropertyChangedを実装する必要があるという一般的なコンセンサスがあると思います。
HTH、 ローラン
他のヒント
それは、実際にどのオブジェクトを参照しているかによって異なります。オブジェクトがXAMLツリーに配置されることを目的としている場合、DependencyPropertiesを使用して(したがって、すべてのUIElementが行うDependencyObjectを継承して)DependencyPropertiesが提供するすべての利点(アニメーション化、バインド、オプションの自動子継承など)を許可するのが最善です。まだお持ちでない場合は、 DependencyPropertiesのMSDN概要を読むことを強くお勧めします。既に。
オブジェクトがデータエンティティである場合(つまり、その値をXAMLツリー内の何かにバインドしている場合)、DependencyObjectから継承する必要はありません。オブジェクトのプロパティが読み取り/書き込み可能な場合は、 INotifyPropertyChanged 。これにより、値が変更されたときにバインディングが自動的に更新されます。
リチャードは、クラスの目的に依存することに同意しますが、メモとして、UIElementまたはUserControlから継承する必要なく、Silverlight 2.0リリースでDependencyObjectから直接継承できるようです。少なくとも、(SilverLight 2.0 RTW)アプリでそれを行っています。
System.Windows.DependencyObject on MSDN
ほとんどのシナリオでDependencyObjectから直接派生するのは 典型的ではない 。代わりに、特定のコントロール、コントロールの基本クラスの1つ(ContentControl、Control、ItemsControl)、FrameworkElement、またはパネルやグリッドなどのUIにまだ参加している非コントロールクラスから派生する場合があります。依存関係プロパティをアクティブにするビジネスまたはデータストレージオブジェクトを定義する場合、または添付プロパティを所有するサービスサポートクラスを作成する場合は、DependencyObjectから派生するのが適切です。
HTH