7

次のような依存関係プロパティを作成しました。

public partial class MyControl: UserControl
{
   //...

   public static DependencyProperty XyzProperty = DependencyProperty.Register("Xyz",typeof (string),typeof (MyControl),new PropertyMetadata(default(string)));

   public string Xyz
   {
       get { return (string) GetValue(XyzProperty ); }
       set { SetValue(XyzProperty , value); }            
   }

   //...
}

それを私のwpfウィンドウにバインドすると、すべてうまくいきました。

セッターにロジックを追加しようとしたときに、それが呼び出されていないことに気付きました。get;Set をある時点まで変更すると、次のようになります。

 get{return null;}
 set{}

そして、それはまだ機能しています!どうして?その GetValue/SetValue 呼び出しの用途は何ですか?

4

2 に答える 2

8

WPF データ バインディング インフラストラクチャは DependencyProperty を直接使用します。Xyz プロパティはプログラマにとって便利なインターフェイスです。

DependencyProperty.Register への呼び出しでPropertyMetadataを見てください。プロパティ値が変更されたときに実行されるコールバックを指定できます。ここでビジネス ロジックを適用できます。

于 2012-08-10T17:26:04.900 に答える
1

DependencyProperty は、XyzProperty のバッキング ストアです。DependencyProperty インターフェイスを介してプロパティにアクセスすると、プロパティの Get/Set アクセサーが完全にバイパスされます。

次のように考えてください。

private int _myValue = 0;

public int MyValue
{
    get { return _myValue; }
    set { _myValue = value; }
}

この場合、手動で を割り当てる_myValue = 12と、明らかに MyValue プロパティの "Set" アクセサーは呼び出されません。完全に迂回しました!同じことが DependencyProperties にも当てはまります。WPF のバインド システムは、DependencyProperty インターフェイスを直接使用します。

于 2012-08-10T17:29:56.447 に答える