2013-03-14 15 views
5

私はここから依存オブジェクトについてのチュートリアルに従っていました:http://tech.pro/tutorial/745/wpf-tutorial-introduction-to-dependency-propertiesDependencyObjectを継承するクラスはどのように使用されますか?

まだ、私はまだ少し混乱しています。

namespace DPTest 
{ 
    class Audio : DependencyObject 
    { 
     public static readonly DependencyProperty fileTypeProperty = DependencyProperty.Register("fileType", typeof(String), typeof(Audio), 
     new PropertyMetadata("No File Type", fileTypeChangedCallback, fileTypeCoerceCallback), fileTypeValidationCallback); 

     public String fileType 
     { 
      get 
      { 
       return (String)GetValue(fileTypeProperty); 
      } 
      set 
      { 
       SetValue(fileTypeProperty, value); 
      } 
     } 

     private static void fileTypeChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
     { 
      Console.WriteLine(e.OldValue + " - " + e.NewValue); 
     } 

     private static object fileTypeCoerceCallback(DependencyObject obj, object o) 
     { 
      String s = o as String; 
      if (s.Length > 0) 
      { 
       s = s.Substring(0, 8); 
      } 

      return s; 
     } 

     private static bool fileTypeValidationCallback(object value) 
     { 
      return value != null; 
     } 
    } 
} 

いくつかの質問:

  1. なぜプロパティは静的である私は自分の学習の目的のために純粋で、本当の用法を持っていない、次のクラスを作成しましたか?オブジェクトレベルで値を格納するのかどうかは完全にはわかりません。
  2. Coerceコールバックは何を行い、なぜそれが含まれていますか?
  3. 私のクラスの目的は何ですか?どこで使うのですか?

答えて

8

長いとそれの短いが、あなたはおそらく、あなたがModel-View-ViewModelを行く場合のDependencyObjectのを必要としませんが、あなたの特定の質問に答えることである:

  1. たDependencyProperty 定義は、すべてのインスタンスので、静的ですDependencyObjectは定義を共有します。彼らはfancier per-object property Dictionaryのようなものです。これにより、Binding or rendering updatesのようなシームレスに動作する様々なフレームワーク機能が可能になります。

  2. DependencyProperty Coercion occursプロパティの変更を一緒にする必要がある場合。たとえば、最小値と最大値の間に存在する値を持つSliderコントロールがある場合、CoerceValueコールバックを使用して適切な範囲内に収まるようにします。

  3. DependencyObjectsはユーザーコードではなく、代わりにWPF開発のModel-View-ViewModelパターンに置き換えられています。 DependencyObjectsはカスタムコントロールの開発にあります。 DependencyPropertiesは、通常、ユーザコードではAttached Propertiesの形式で共通しています。

+0

したがって、WPFを使用する一般的なデスクトップおよびモバイルアプリケーション開発でDependencyPropertiesを使用するための実際の使用はありません。私はいつそれらを使う必要がありますか? –

+0

これはかなり広い質問ですが、#3の答えで概説しました。 – user7116

3

オブジェクトタイプにプロパティを割り当てるため、依存プロパティ自体は静的です。これはプロパティ全体を識別し、CLRプロパティのように値を取得するだけではありません。

(静的でない)CLRプロパティからわかるように、ストレージ機能はSetValueGetValueだけで処理されます。依存性プロパティの値は、任意のコンテンツを入れる大きな辞書として想像することができます。辞書のキーは依存関係プロパティです。

強制コールバックは、値を何らかの形式に強制するために使用されます。あなたの場合は、文字列が8文字だけであることを確認します。ほとんどの場合、そのようなコールバックは必要ありません。あなたは頻繁に変更されたコールバックを必要としません。最も一般的なケースは単にバインド可能なプロパティであり、そこには標準のメタデータで依存関係プロパティを定義するだけで十分です。

あなたのクラスの目的は、私が推測する例として役立つことです。特定のユースケースがない場合は、依存オブジェクトを調べることをお勧めしません。実際にはサブタイプDependencyObjectはごくまれです。通常、継承してカスタムビヘイビアを追加するフレームワーク要素またはコンポーネントがあります。そして、XAMLなどのバインド可能なプロパティが必要なときはいつでも、依存関係プロパティが必要です。

関連する問題