Windows Presentation Foundation (WPF) 提供了一組服務,這些服務可用於擴展common languageruntime (CLR) 屬性的功能。 這些服務通常統稱為 WPF 屬性系統。 由 WPF 屬性系統支持的屬性稱為依賴項屬性。依賴屬性是一種可以自己沒有值,並能通過使用Binding從數據源獲得值的屬性(通俗的講,就是依賴在別的屬性上)。
依賴屬性與CLR屬性
- 依賴屬性支持CLR屬性
- 依賴項屬性的用途在於提供一種方法來基於其他輸入的值計算屬性值。這些其他輸入可以包括系統屬性(如主題和用戶首選項)、實時屬性確定機制(如數據綁定和動畫/演示圖板)、重用模板(如資源和樣式)或者通過與元素樹中其他元素的父子關係來公開的值。 另外,可以通過實現依賴項屬性來提供獨立驗證、默認值、監視其他屬性的更改的回調以及可以基於可能的運行時信息來強制指定屬性值的系統。 派生類還可以通過重寫依賴項屬性元數據(而不是重寫現有屬性的實際實現或者創建新屬性)來更改現有屬性的某些具體特徵。
- 如何區分依賴屬性與CLR屬性:在屬性的MSDN幫助文檔中,假如該屬性為依賴屬性,在屬性說明中會有依賴項屬性信息說明,如下(TextBox.Text):
定義依賴屬性
//依賴屬性名稱MyTextProperty//依賴屬性標識符MyTextpublicstaticreadonlyDependencyPropertyMyTextProperty=DependencyProperty.Register("MyText",typeof(string),typeof(MyTextBox));//依賴屬性的CLR屬性包裝publicstringMyText{get{return(string)GetValue(MyTextProperty);}set{SetValue(MyTextProperty,value);}}
name | 要註冊的依賴項對象的名稱。 |
propertyType | 屬性的類型。 |
ownerType | 正註冊依賴項對象的所有者類型。 |
typeMetadata | 依賴項對象的屬性元數據。 |
validateValueCallback | 對回調的引用,除了典型的類型驗證之外,該引用還應執行依賴項對象值的任何自定義驗證。 |
依賴屬性提供的屬性功能
資源
<Window.Resources><!--資源--><sys:Stringx:Key="text">text_Resources</sys:String></Window.Resources><Grid><!--Text屬性引用資源--><MyTextBox:MyTextBoxx:Name="myTextBox"HorizontalAlignment="Left"Height="44"Margin="70,81,0,0"TextWrapping="Wrap"VerticalAlignment="Top"Width="213"Text="{DynamicResourcetext}"/></Grid>
數據綁定
- 屬性系統強制轉換。
- 活動動畫或具有 Hold 行為的動畫。為了獲得任何實用效果,屬性的動畫必須優先於基(未動畫)值,即使該值是在本地設定的情況下也將如此。
- 本地值。本地值可以通過“包裝”屬性的便利性進行設定,這也相當於在 XAML 中設定特性或屬性元素,或者使用特定實例的屬性調用 SetValue API。 如果您使用綁定或資源來設定本地值,則每個值都按照直接設定值的優先權順序來套用。
- TemplatedParent 模板屬性。如果元素是作為模板(ControlTemplate 或 DataTemplate)的一部分創建的,則具有TemplatedParent。 在模板中,按以下優先權順序套用:
- 來自TemplatedParent 模板的觸發器。
- TemplatedParent 模板中的屬性集。(通常通過 XAML 特性進行設定。)
- 隱式樣式。僅套用於 Style 屬性。 Style 屬性是由任何樣式資源通過與其類型匹配的鍵來填充的。 該樣式資源必須存在於頁面或應用程式中;查找隱式樣式資源不會進入到主題中。
- 樣式觸發器。來自頁面或應用程式上的樣式中的觸發器。(這些樣式可以是顯式或隱式樣式,但不是來自優先權較低的默認樣式。)
- 模板觸發器。來自樣式中的模板或者直接套用的模板的任何觸發器。
- 樣式 Setter。來自頁面或應用程式的樣式中的Setter的值。
- 默認(主題)樣式。 在默認樣式中,按以下優先權順序套用:
- 主題樣式中的活動觸發器。
- 主題樣式中的 Setter。
- 繼承。有幾個依賴項屬性從父元素向子元素繼承值,因此不需要在應用程式中的每個元素上專門設定這些屬性。
- 來自依賴項屬性元數據的默認值。任何給定的依賴項屬性都具有一個默認值,它由該特定屬性的屬性系統註冊來確定。 而且,繼承依賴項屬性的派生類具有按照類型重寫該元數據(包括默認值)的選項。 因為繼承是在默認值之前檢查的,所以對於繼承的屬性,父元素的默認值優先於子元素。 因此,如果任何地方都沒有設定可繼承的屬性,將使用在根元素或父元素中指定的默認值,而不是子元素的默認值。