3

私は Silverlight アプリケーションを構築していますが、前回の警告の 1 つは、Silverlight/WPF の方法で何かを正しく行う必要がある場合は、オブジェクトを DependecyObject としてモデル化し、DependencyProperty(ies) を使用する必要があるということでした。

このモデルはやや面倒で、私が使用するクラスの半分で静的フィールドと初期化子を必要とするため、DependencyObject の代わりに古き良きイベント駆動型 (オブザーバー パターン?) を使用することをお勧めしますか?

私はコードの肥大化とボイラー プレートを最小限に抑えることを目指しています (私はそれらが嫌いです)。Silverlight/WPF の経験がある人に、DependencyObject と DependencyProperty の使用を最小限に抑えるためのヒント/テクニックがあるかどうかを本当に知りたいですか?

これは良い考えですか?

4

3 に答える 3

4

実際、Silverlight では DependencyObjects を継承できないため、代わりに INotifyPropertyChanged を実装する必要があります (実装する必要があります)。

INotifyPropertyChanged の実装には、DependencyObjects (わかりやすくするためにこの DO を省略します) や DependencyProperties (DP) の使用よりも多くの利点があります。

  • これはもっと軽量です
  • オブジェクトのモデリングの自由度が向上
  • 簡単にシリアライズできる
  • 必要に応じてイベントを発生させることができます。これは、特定のシナリオで役立ちます。たとえば、複数の変更を 1 つの UI 操作だけにまとめたい場合や、データが変更されていない場合でもイベントを発生させる必要がある場合 (強制再描画...)

一方、WPF で DO を継承すると、次の利点があります。

  • 特に初心者にとっては、より簡単に実装できます。
  • コールバック メカニズムを (ほぼ) 無料で入手できるため、プロパティ値が変更されたときに通知を受け取ることができます。
  • プロパティの最大値、最小値、および現在値のルールを定義できる強制メカニズムを取得します。

他にも注意点はありますが、主なものは以上です。

一般的なコンセンサスは、DP はコントロールに最適である (そして、Silverlight でもカスタム DP を使用して CustomControl を実装できる) ということですが、データ オブジェクトの場合は INotifyPropertyChanged を実装する必要があります。

HTH、ローラン

于 2008-10-01T13:13:27.863 に答える
3

どのオブジェクトを参照しているかによって異なります。オブジェクトが XAML ツリーに配置されることを意図している場合は、DependencyProperties を使用して (したがって、すべての UIElement が行う DependencyObject を継承して)、DependencyProperties が提供するすべての利点 (アニメート可能、バインディング、オプションの自動子継承など) を実現するのが最善です。まだ読んでいない場合は、DependencyProperties に関する MSDNの概要を読むことを強くお勧めします。

オブジェクトがデータ エンティティである場合 (つまり、その値を XAML ツリー内の何かにバインドしている場合)、DependencyObject から継承する必要はありません。オブジェクトのプロパティが読み書き可能である場合は、 INotifyPropertyChangedを実装することをお勧めします。これにより、値が変更されたときにバインドが自動的に更新されます。

于 2008-10-01T08:58:36.790 に答える
1

クラスの目的に依存するというリチャードの意見に同意しますが、UIElement や UserControl から継承する必要なく、Silverlight 2.0 リリースでは DependencyObject から直接継承できるようです。少なくとも、私は (SilverLight 2.0 RTW) アプリでそれを行っています。

MSDN の System.Windows.DependencyObject

ほとんどのシナリオで、DependencyObject から直接派生することは一般的ではありません。代わりに、特定のコントロール、コントロール基本クラス (ContentControl、Control、ItemsControl) の 1 つ、FrameworkElement、または Panel や Grid などの UI にまだ参加している非コントロール クラスから派生させることができます。依存関係プロパティをアクティブにするビジネスまたはデータ ストレージ オブジェクトを定義している場合、または添付プロパティを所有するサービス サポート クラスを作成している場合は、DependencyObject からの派生が適切な場合があります。

HTH

于 2008-11-24T21:50:51.420 に答える