2012-08-10 7 views
6

私はこのような依存関係プロパティ作成しました:get/set in dependencyプロパティは何もしません。

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{return null;} 
set{} 

これはまだ動作しています!どうして?そのGetValue/SetValue呼び出しの使用は何ですか?

+0

[こちら](http://msdn.microsoft.com/en-us/library/bb613563.aspx#implications)を参照して、プロパティラッパーに追加のロジックを配置しない理由を参照してください。 – Clemens

答えて

6

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

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

+0

私は参照してください。しかし、私はまだそれが必要ですか?ソースから削除しようとしましたが、明らかにコンパイラに不満がありました。 – OscarRyz

+0

コード内で参照している場合は、プロパティが必要です。それ以外の場合は必要ありません。宣言的にバインドする場合は、 'Xyz'という名前を使用しますが、メンバープロパティを必要とせずに依存関係プロパティを解決します。 –

1

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

と思いますこのよう:このインスタンスで

private int _myValue = 0; 

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

、私は手動で_myValue = 12を割り当てた場合、明らかにMyValueプロパティの「設定」アクセサが呼び出されません。私はそれを完全にバイパスしました! DependencyPropertiesについても同様です。 WPFのバインディングシステムは、DependencyPropertyインターフェイスを直接使用します。

+0

そのため、GetValue/SetValueを呼び出す必要があります。私が直接 'this.Xyz =" newValue ";' – OscarRyz

+0

を直接呼び出す場合Get/Setプロパティラッパーは便利ですが、最終的にはWPFのバインディングシステムとは関係ありません。 – BTownTKD

関連する問題