概述: Windows Presentation Foundation (WPF) 提供了一組服務,這些服務可用於擴展公共語言運行時 (CLR) 屬性的功能。這些服務通常統稱為 WPF 屬性系統。由 WPF 屬性系統支持的屬性稱為依賴項屬性。 依賴項屬性提供用來擴展屬性功能的功能, 最常用的莫過於“ ...
概述:
Windows Presentation Foundation (WPF) 提供了一組服務,這些服務可用於擴展公共語言運行時 (CLR) 屬性的功能。這些服務通常統稱為 WPF 屬性系統。由 WPF 屬性系統支持的屬性稱為依賴項屬性。
依賴項屬性提供用來擴展屬性功能的功能, 最常用的莫過於“數據綁定”功能,依賴項屬性可以通過數據綁定來引用值。數據綁定通過特定的標記擴展語法(在 XAML 中)或 Binding 對象(在代碼中)來工作。使用數據綁定,最終屬性值的確定將延遲到運行時,在運行時,將從數據源獲取屬性值,並可實現動態更新。
本文目的:
介紹依賴屬性應用場景,及自定義依賴屬性方法。
正文:
什麼是依賴屬性
依賴屬性可支持WPF中的樣式設置、數據綁定、繼承、動畫及預設值。依賴項屬性是通過調用 Register 方法(或 RegisterReadOnly)在 WPF 屬性系統中註冊,並通過 DependencyProperty 標識符標示屬性。 依賴項屬性只能由繼承自 DependencyObject 類的類型使用,但 DependencyObject 在 WPF 類層次結構中的級別很高,因此,WPF 中的大多數可用類都支持依賴項屬性。
何時應實現依賴項屬性
將所有的屬性都設置為依賴屬性並不總是正確的解決方案,具體取決於其應用場景。有時,使用私有欄位實現屬性的典型方法便能滿足要求。MSDN中給出了下麵幾種應用依賴屬性的場景:
1. 希望可在樣式中設置屬性。
2. 希望屬性支持數據綁定。
3. 希望可使用動態資源引用設置屬性。
4. 希望從元素樹中的父元素自動繼承屬性值。
5. 希望屬性可進行動畫處理。
6. 希望屬性系統在屬性系統、環境或用戶執行的操作或者讀取並使用樣式更改了屬性以前的值時報告。
7. 希望使用已建立的、WPF 進程也使用的元數據約定,例如報告更改屬性值時是否要求佈局系統重新編寫元素的可視化對象。
目前我使用最多的場景是前三條,下麵是一個典型的依賴屬性在數據綁定上的應用場景:
界面上有A、B兩個圖片,大小一樣,我們需要在改變圖片A大小的時候,同時也改變圖片B的大小,讓他們的大小總保持一致。按照通常的做法我們應該怎麼做?
我們需要在圖片A的SizeChanged事件中添加處理圖片B的方法。把圖片A的Size賦給圖片B。這麼一個簡單的功能需要這麼一段代碼來做是不是有點繁瑣,若此類需求更多,則你需要處理的事件將更多。
然而使用依賴屬性,可以用下麵三句話實現此功能:
imageB.DataContext = imageA; imageB.SetBinding(Image.WidthProperty, "Width"); imageB.SetBinding(Image.HeightProperty, "Height");
怎麼樣,夠簡潔吧!這段話大致的意思就是:
1. 將ImageB的參與數據綁定時的數據上下文為ImageA,即ImageB上綁定的數據都到ImageA上找;
2. 將ImageB的寬高通過SetBinding的方法綁定到"Width"及"Height"兩個屬性上。這兩個屬性的值在哪裡找,就在ImageB的DataContext中找,在這裡就是ImageA的"Width"及"Height"。
這樣就將ImageA和ImageB的"Width"及"Height"綁定在一起,其中一個圖片的"Width"及"Height"發生改變時,另一個圖片的Size也會相應的發生改變。
如何自定義依賴屬性
在類上實現屬性時,只要該類派生自 DependencyObject,便可以選擇使用 DependencyProperty 標識符來標示屬性,從而將其設置為依賴屬性。其語法如下:
public static DependencyProperty TextProperty = DependencyProperty.Register("Text", //屬性名稱 typeof(string), //屬性類型 typeof(TestDependencyPropertyWindow), //該屬性所有者,即將該屬性註冊到那個類上 new PropertyMetadata("")); //屬性預設值 public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } }
可以看到其與普通屬性的主要區別在於:
1. 欄位必須為static,且類型為DependencyProperty,欄位名需遵守命名約定,即尾碼為Property;
2. 欄位的修飾符須設置為Public,否則在外部不能通過SetBinding方法,綁定此屬性的值;
3. 欄位的值通過DependencyProperty.Register來設置,各參數的說明詳見代碼中的說明;
4. 設置屬性值時,通過SetValue、GetValue而不是Set、Get。
通過上面的方法我們便在CustomSape類上自定義了一個依賴屬性“Text”,然後我們便可以像使用系統自帶的依賴屬性一樣,使用這個屬性。
總之,依賴屬性是WPF的一個重要特性,可以用簡單的幾句話,實現原來Winform實現起來非常繁瑣的功能。具體什麼時候使用依賴屬性、什麼時候使用普通屬性,就要看具體的使用情況,並參照MSDN給出的7個應用場景。
轉載:http://www.cnblogs.com/xiongpq/archive/2010/06/29/1767905.html