数据绑定(Binding)
Windows Presentation Foundation (WPF) 中的數據綁定為應用程序提供了一種簡單、一致的數據表示和交互方法。元素能夠以公共語言運行時 (CLR) 對象和 XML 形式綁定到來自各種數據源的數據。
什么是數據綁定?
數據綁定是在應用程序 UI 與業務邏輯之間建立連接的過程。如果綁定具有正確設置并且數據提供正確通知,則當數據更改其值時,綁定到數據的元素會自動反映更改。數據綁定可能還意味著如果元素中數據的外部表現形式發生更改,則基礎數據可以自動更新以反映更改。例如,如果用戶編輯 TextBox 元素中的值,則基礎數據值會自動更新以反映該更改。
基本數據綁定概念
不論要綁定什么元素,不論數據源的特性是什么,每個綁定都始終遵循下圖所示的模型:
如上圖所示,數據綁定實質上是綁定目標與綁定源之間的橋梁。該圖演示以下基本的 WPF 數據綁定概念:
- 通常,每個綁定都具有四個組件:綁定目標對象、目標屬性、綁定源,以及要使用的綁定源中的值的路徑。例如,如果要將 TextBox 的內容綁定到 Employee 對象的 Name 屬性,則目標對象是 TextBox,目標屬性是 Text 屬性,要使用的值是 Name,源對象是 Employee 對象。
- 目標屬性必須為依賴項屬性。大多數 UIElement 屬性都是依賴項屬性,而大多數依賴項屬性(除了只讀屬性)默認情況下都支持數據綁定。(只有DependencyObject 類型可以定義依賴項屬性,所有 UIElement 都派生自 DependencyObject。)
- 盡管圖中并未指出,但應該注意,綁定源對象并不限于自定義 CLR 對象。WPF 數據綁定支持 CLR 對象和 XML 形式的數據。舉例來說,綁定源可以是 UIElement、任何列表對象、與 ADO.NET 數據或 Web 服務關聯的 CLR 對象,或是包含 XML 數據的 XmlNode。有關更多信息,請參見綁定源概述
特別注意:當建立綁定時,是將綁定目標綁定到 綁定源。例如,如果要使用數據綁定在一個 ListBox 中顯示一些基礎 XML 數據,就是將 ListBox 綁定到 XML 數據。
數據流的方向
正如上文所述和上圖中箭頭所示,綁定的數據流可以從數據目標流向數據源(例如,當用戶編輯 TextBox 的值時,源值會發生更改)和/或(如果綁定源提供正確的通知)從綁定源流向綁定目標(例如,TextBox 內容會隨綁定源中的更改而進行更新)。
有時可能希望應用程序使用戶可以更改數據并將數據傳播回源對象。或者,可能不希望允許用戶更新源數據。可以通過設置 Binding 對象的 Mode 屬性來對此進行控制。下圖演示不同類型的數據流:
- OneWay 綁定導致對源屬性的更改會自動更新目標屬性,但是對目標屬性的更改不會傳播回源屬性。此綁定類型適用于綁定的控件為隱式只讀控件的情況。例如,可能綁定到如股票行情自動收錄器這樣的源,或許目標屬性沒有用于進行更改的控件接口(如表的數據綁定背景色)。如果無需監視目標屬性的更改,則使用 OneWay 綁定模式可避免 TwoWay 綁定模式的系統開銷。
- TwoWay 綁定導致對源屬性的更改會自動更新目標屬性,而對目標屬性的更改也會自動更新源屬性。此綁定類型適用于可編輯窗體或其他完全交互式 UI 方案。大多數屬性都默認為 OneWay 綁定,但是一些依賴項屬性(通常為用戶可編輯的控件的屬性,如 TextBox 的 Text 屬性和 CheckBox 的 IsChecked 屬性)默認為 TwoWay 綁定。確定依賴項屬性綁定在默認情況下是單向還是雙向的編程方法是:使用 GetMetadata 獲取屬性的屬性元數據,然后檢查 BindsTwoWayByDefault 屬性的布爾值。
- OneWayToSource 與 OneWay 綁定相反;它在目標屬性更改時更新源屬性。一個示例方案是您只需要從 UI 重新計算源值的情況。
- OneTime 綁定未在圖中顯示,該綁定會導致源屬性初始化目標屬性,但不傳播后續更改。這意味著,如果數據上下文發生了更改,或者數據上下文中的對象發生了更改,則更改會反映在目標屬性中。如果您使用的數據的當前狀態的快照適于使用,或者這些數據是真正靜態的,則適合使用此綁定類型。如果要使用源屬性中的某個值初始化目標屬性,并且事先不知道數據上下文,則也可以使用此綁定類型。此綁定類型實質上是 OneWay 綁定的簡化形式,在源值不更改的情況下可以提供更好的性能。
特別注意:若要檢測源更改(適用于 OneWay 和 TwoWay 綁定),則源必須實現一種合適的屬性更改通知機制(如 INotifyPropertyChanged)。有關 INotifyPropertyChanged 實現的示例,請參見如何:實現屬性更改通知。
觸發源更新的原因
TwoWay 或 OneWayToSource 綁定偵聽目標屬性的更改,并將這些更改傳播回源。這稱為更新源。例如,可以編輯文本框中的文本以更改基礎源值。
但是,源值是在您編輯文本的同時進行更新,還是在您結束編輯文本并將鼠標指針從文本框移走后才進行更新呢?綁定的 UpdateSourceTrigger 屬性確定觸發源更新的原因。下圖中右箭頭的點演示 UpdateSourceTrigger 屬性的角色:
如果 UpdateSourceTrigger 值為 PropertyChanged,則 TwoWay 或 OneWayToSource 綁定的右箭頭指向的值會在目標屬性更改時立刻進行更新。但是,如果 UpdateSourceTrigger 值為 LostFocus,則僅當目標屬性失去焦點時,該值才會使用新值進行更新。
與 Mode 屬性類似,不同的依賴項屬性具有不同的默認 UpdateSourceTrigger 值。大多數依賴項屬性的默認值都為 PropertyChanged,而 Text 屬性的默認值為 LostFocus。這意味著,只要目標屬性更改,源更新通常都會發生,這對于 CheckBox 和其他簡單控件很有用。但對于文本字段,每次鍵擊之后都進行更新會降低性能,用戶也沒有機會在提交新值之前使用退格鍵修改鍵入錯誤。這就是為什么 Text 屬性的默認值是 LostFocus 而不是 PropertyChanged 的原因。
創建綁定
前面幾節中討論的一些概念可以概括為:使用 Binding 對象建立綁定,每個綁定通常都具有四個組件:綁定目標、目標屬性、綁定源、要使用的源值的路徑。本節討論如何設置綁定。
請看下面的示例,其中的綁定源對象是一個名為 MyData 的類,該類在 SDKSample 命名空間中定義。出于演示的目的,MyData 類具有一個名為 ColorName 的字符串屬性,該屬性的值設置為“Red”。因此,此示例生成一個具有紅色背景的按鈕。
C#:
<DockPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:c="clr-namespace:SDKSample"><DockPanel.Resources><c:MyData x:Key="myDataSource"/></DockPanel.Resources><DockPanel.DataContext><Binding Source="{StaticResource myDataSource}"/></DockPanel.DataContext><Button Background="{Binding Path=ColorName}"Width="150" Height="30">I am bound to be RED!</Button>
</DockPanel> 如果將此示例應用于基本關系圖,則生成的圖如下所示。這是一個 OneWay 綁定,因為 Background 屬性在默認情況下支持 OneWay 綁定。
指定綁定源
請注意,在上一個示例中,綁定源是通過設置 DockPanel 元素上的 DataContext 屬性來指定的。Button 隨后從 DockPanel(這是其父元素)繼承 DataContext 值。在這里重復一下,綁定源對象是綁定的四個必需組件之一。因此,如果未指定綁定源對象,則綁定將沒有任何作用。
可通過多種方法指定綁定源對象。在將多個屬性綁定到相同源時,可以使用父元素上的 DataContext 屬性。但是,在各個綁定聲明上指定綁定源有時可能更為合適。對于上一個示例,可以不使用 DataContext 屬性,而是通過在按鈕的綁定聲明上直接設置 Source 屬性來指定綁定源,如下面的示例中所示:
<DockPanel.Resources><c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"Background="{Binding Source={StaticResource myDataSource},Path=ColorName}">I am bound to be RED!</Button> 除了在元素上直接設置 DataContext 屬性、從上級繼承 DataContext 值(如第一個示例中的按鈕)、通過設置 Binding 上的 Source 屬性來顯式指定綁定源(如最后一個示例中的按鈕),還可以使用 ElementName 屬性或 RelativeSource 屬性指定綁定源。當綁定到應用程序中的其他元素時(例如在使用滑塊調整按鈕的寬度時),ElementName 屬性是很有用的。當在 ControlTemplate 或 Style 中指定綁定時,RelativeSource 屬性是很有用的。
指定值的路徑
- 如果綁定源是一個對象,則可使用 Path 屬性指定要用于綁定的值。如果要綁定到 XML 數據,則可使用 XPath 屬性指定該值。在某些情況下,可以使用 Path 屬性,即使在數據為 XML 時。例如,如果要訪問返回的 XmlNode(作為 XPath 查詢的結果)的 Name 屬性,則應使用 Path 屬性和 XPath 屬性。
- 請注意,雖然我們已強調要使用的值的 Path 是綁定的四個必需組件之一,但在要綁定到整個對象的情況下,要使用的值會與綁定源對象相同。在這些情況下,不指定 Path 比較合適。請看下面的示例:
C#:
<ListBox ItemsSource="{Binding}"IsSynchronizedWithCurrentItem="true"/> - 上面的示例使用空綁定語法:{Binding}。在此情況下,ListBox 從父 DockPanel 元素繼承 DataContext(此示例中未演示)。當未指定路徑時,默認為綁定到整個對象。換句話說,在此示例中路徑已被省略,因為要將 ItemsSource 屬性綁定到整個對象。
- 除了綁定到集合以外,在希望綁定到整個對象,而不是僅綁定到對象的單個屬性時,也可以使用此方案。例如,在源對象為類型字符串,并且您僅僅希望綁定到該字符串本身時。
參考資料:數據綁定概述 https://msdn.microsoft.com/zh-cn/library/ms752347(v=vs.90).aspx
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
轉載于:https://www.cnblogs.com/gongchuangsu/p/4850202.html
總結
以上是生活随笔為你收集整理的数据绑定(Binding)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: innodb force recover
- 下一篇: html5小趣味知识点系列(一)auto