WP7中的DependencyProperty

原來不知道什麼意思,今天專門研究了下這個類。下面我看到的一片博文摘下來,看過以後就明白了。一句話理解的話就是c#實現類的屬性的另外一種方法。c#

 

DependencyProperty在WPF中是一個至關重要的概念,幾乎在WPF的應用中都應該會使用到它。可是對於剛從WinForm轉過來的人可能會不覺得然,仍然使用原來的屬性書寫方法(定義一個數據成員,而後給這個成員添加一個屬性),不是說不能這樣使用,可是在WPF中使用DependencyProperty會更高效,並且更加便捷。下面是我學習DependencyProperty的總結。函數


一.實現一個標準的依賴屬性
public class SimpleButton : ButtonBase
{
    public static readonly DependencyProperty IsSimpleProperty;
}
首先它必須是DependencyProperty類型;第二,它必須使用public和static修飾符;第三,必須使用Property做爲後綴。

咱們能夠經過使用DependencyProperty.Register(...)函數來建立依賴屬性,該函數有3個重載,經過Register函數的參數,能夠告訴WPF如何處理依賴屬性(詳見MSDN,對Register的描述),
public class SimpleButton : ButtonBase
{
    public static readonly DependencyProperty IsSimpleProperty;
    static SimpleButton()
    {
        IsSimpleProperty = DependencyProperty.Register("IsSimple", typeof(bool), typeof(SimpleButton), ...);
    }

    public bool IsSimple
    {
        get{return (bool)GetValue(IsSimpleProperty);}
        set{SetValue(IsSimpleProperty, value);}
    }
}
看了上面的代碼你可能會懷疑可否正常運行?IsSimpleProperty是static變量,而咱們的IsSimple是成員變量,若是有兩個SimpleButton實例的話不就使用了相同的數據了?有這樣的懷疑是應該的,可是你可知道GetValue和SetValue可不是簡單的函數。[參考<<WPF揭祕>>]GetValue和SetValue的實現使用了很高效的稀疏存儲系統,它會幫咱們管理這些數據,因此上面的懷疑大可沒必要。並且更重要的是它能夠爲咱們節省內存,這是使用依賴屬性的一大好處,由於依賴屬性是靜態的成員,沒必要每一個實例生成一個成員數據,全部的數據被統一塊兒來管理,這樣固然能夠節省不少內存了,特別是成員變量比較多的時候。既然有這樣的好處咱們有什麼理由不使用它呢?除了這些做用,依賴屬性還有兩外的幾個好處,下面將詳細描述。
GetValue和SetValue這兩個函數是來之類DependencyObject,也就是說想要實現依賴屬性,必須保證你的類是一個DependencyObject。

二.依賴屬性的好處
除了上面說的節省內存的好處,另外還有幾個好處,分別是:屬性繼承,變動通知。
1.屬性繼承,這個繼承有別於父類和子類之間的繼承,它是指修改了某個依賴屬性,它的變動會應用到子控件中具備相同屬性的控件。按照《WPF揭祕》說的就是:屬性值自頂向下沿着元素樹進行傳遞。要具備這個繼承的的功能咱們只須要把原數據FrameworkPropertyMetadataOptions.Inherits做爲參數傳給Register就OK了。   這裏值得注意的是繼承可以被高優先級的源的設置阻斷,好比StatusBar,它是有主題樣式設置程序來設置的,若是你把它包進一個Window中,而且這個Window設置了某些StatusBar具備的依賴屬性,可是你會發現你的設置並無影響到StatusBar.(該例子來之《WPF 揭祕》)。下面列出設置依賴屬性的程序的優先級(來自《WPF揭祕》,詳細請查閱該書):
(1)本地值 :即SetValue。
(2)樣式觸發器
(3)模板觸發器 
(4)樣式設置程序 
(5)主題樣式觸發器 
(6)主題樣式設置程序 
(7)屬性值繼承 
(8)默認值 :初始化的值。
2.變動通知比較容易理解,指的是若是依賴屬性改變了,那麼它就自動地幫咱們發出通知,告訴好比像Trigger這樣的東西。若是要本身實現這個通知的話咱們必需要去實現INodifyPropertyChanged接口,而後每次改變的時候去觸發屬性改變的事件,因此依賴屬性確實給咱們提供了很多方便。

根據《WPF揭祕》描述的還有另外一個好處:對多個提供程序的支持,關於這個話題能夠查閱該書。
相關文章
相關標籤/搜索