6

ここから依存オブジェクトに関するチュートリアルに従っていました: http://tech.pro/tutorial/745/wpf-tutorial-introduction-to-dependency-properties

それでも、私はまだ少し混乱しています。次のクラスを作成しましたが、これは純粋に自分の学習目的であり、実際には使用されません。

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. クラスの目的は何ですか? どこで使用しますか?
4

2 に答える 2

8

要するに、 Model-View-ViewModelに行く場合は DependencyObject は必要ない可能性が高いですが、特定の質問に答えるために:

  1. DependencyObjectのすべてのインスタンスが定義を共有するため、DependencyProperty定義は静的です。これらは、より洗練されたオブジェクトごとのプロパティ Dictionary のようなものです。これにより、バインディングやレンダリングの更新など、さまざまなフレームワーク機能をシームレスに動作させることもできます。

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

  3. DependencyObjects はユーザー コードでは支持されなくなり、代わりに、WPF 開発の Model-View-ViewModel パターンに大きく取って代わられました。DependencyObjects がまだカスタム コントロールの開発段階にあります。DependencyPropertiesはユーザー コードで一般的であり、通常はAttached Propertiesの形式です。

于 2013-03-14T00:33:55.123 に答える
3

プロパティをオブジェクト型に割り当てているため、依存関係プロパティ自体は静的です。プロパティ全体を識別し、CLR プロパティのように値をキャプチャするだけではありません。

(非静的) CLR プロパティでわかるように、ストレージ機能は単独で処理さSetValueれます。GetValue依存関係プロパティの値は、任意のコンテンツを入れるだけの大きな辞書と考えることができます。ディクショナリのキーは依存関係プロパティです。

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

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

于 2013-03-14T00:38:54.050 に答える