2012-08-10 107 views
6

我創建了一個依賴項屬性是這樣的:如何獲取/設置依賴屬性不做任何事情?

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;現在設置他們看起來像這樣:

get{return null;} 
set{} 

而且它仍然有效!怎麼來的?那個GetValue/SetValue調用有什麼用?

+0

另請參閱[這裏](http://msdn.microsoft.com/en-us/library/bb613563.aspx#implications)爲什麼你不應該把任何額外的邏輯放入屬性包裝中。 – Clemens 2012-08-10 18:15:39

回答

6

WPF數據綁定基礎結構直接使用DependencyProperty,Xyz屬性是程序員的便利接口。

看看PropertyMetadata在對DependencyProperty.Register的調用中,您可以提供一個回調,當屬性值發生變化時這個回調會運行,這是您可以應用業務邏輯的地方。

+0

我明白了。但我仍然需要它嗎?我試圖從源代碼中刪除它,顯然編譯器抱怨 – OscarRyz 2012-08-10 17:29:44

+0

如果您在代碼中引用它,則只需要該屬性。否則就不需要了,如果你聲明性地綁定,你將使用'Xyz'這個名字,但會解析爲你的依賴屬性而不需要成員屬性。 – 2012-08-10 17:43:22

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 2012-08-10 17:32:21

+0

正確。 Get/Set屬性包裝器對您來說很方便,但最終與WPF的綁定系統無關。 – BTownTKD 2012-08-10 17:33:17