使用Windows Presentation Foundation (WPF) 能夠很方便的設計出強大的用戶界面,同時 WPF提供了數據綁定功能。WPF的數據綁定跟Winform與ASP.NET中的數據綁定功能相似,但也有所不一樣,在 WPF中以經過後臺代碼綁定、前臺XAML中進行綁定,或者二者組合的方式進行數據綁定。您能夠綁定控件、公共屬性、XML 或對象,WPF中的數據綁定跟WinForm與ASP.NET相比,更加快捷、靈活和簡單。編程
WPF 中的數據綁定,必需要有綁定目標和要綁定的數據源。綁定目標能夠是繼承自 DependencyProperty的任何可訪問的屬性或控件,例如 TextBox 控件的 Text 屬性。數據源能夠是其餘控件的屬性,能夠是對象實例、XAML 元素、ADO.NET Dataset、XML數據。微軟針對XML綁定與對象綁定,提供了兩個輔助類XmlDataProvider 和 ObjectDataProvider。windows
WPF的數據綁定跟ASP.NET與WinForm中的數據綁定有什麼不一樣呢? 最大不一樣就是WPF使用{Binding …}這一語句。 app
Binding是用來實現界面控件的屬性與後臺數據之間的綁定,經過這種形式將前臺界面與後臺數據聯繫在一塊兒達到界面與數據耦合的目的。ide
WPF綁定引擎從 Binding 對象獲取有關如下內容的信息:性能
源對象和目標對象。spa
數據流的方向。你能夠經過設置 Binding.Mode 屬性來指定該方向。設計
值轉換器(若是存在)。你可經過將 Converter 屬性設置爲用來實現 IValueConverter 的類的一個實例,指定值轉換器。 雙向綁定
WPF與ASP.NET與WinForm中的綁定方式比較,存在着以下幾點差別:code
(1)Binding能夠經過XAML語句實現界面與數據的耦合。若是把Binding比做數據的橋樑,那麼它的兩端分別是Binding的源和目標。數據從哪裏來哪裏就是源,Binding是架在中間的橋樑,Binding目標是數據要往哪兒去。通常狀況下,Binding源是邏輯層的對象,Binding目標是UI層的控件對象,這樣,數據就會源源不斷 經過Binding送達UI層,被UI層展示,也就完成了數據驅動UI的過程。以下圖。orm
(2)Binding有一個重要的屬性Mode,實現綁定中的數據流向。具體有以下幾種。
成員名稱 |
說明 |
Default |
使用綁定目標的默認 Mode 值。 每一個依賴項屬性的默認值都不一樣。 通常狀況下,用戶可編輯控件屬性(例如文本框和複選框的屬性)默認爲雙向綁定,而多數其餘屬性默認爲單向綁定。 肯定依賴項屬性綁定在默認狀況下是單向仍是雙向的編程方法是:使用 GetMetadata 獲取屬性的屬性元數據,而後檢查 BindsTwoWayByDefault 屬性的布爾值。 |
OneTime |
當應用程序啓動或數據上下文更改時,更新綁定目標。 此綁定類型適用於如下狀況:使用當前狀態的快照適合使用的或數據狀態實際爲靜態的數據。 若是要從源屬性初始化具備某個值的目標屬性,而且事先不知道數據上下文,則也可使用此綁定類型。 此綁定類型實質上是 OneWay 綁定的簡化形式,在源值不更改的狀況下能夠提供更好的性能。 |
OneWay |
當綁定源(源)更改時,更新綁定目標(目標)屬性。 此綁定類型適用於綁定的控件爲隱式只讀控件的狀況。 例如,能夠綁定到如股市代號之類的源。 或者,可能目標屬性沒有用於進行更改(例如表的數據綁定背景色)的控件接口。 若是無需監視目標屬性的更改,則使用 OneWay 綁定模式可避免 TwoWay 綁定模式的系統開銷。 |
OneWayToSource |
當目標屬性更改時更新源屬性。 |
TwoWay |
致使對源屬性或目標屬性的更改可自動更新對方。 此綁定類型適用於可編輯窗體或其餘徹底交互式 UI 方案。 |
(3)可經過配置觸發器,決定用戶在界面輸入的數據在何時去修改數據源中的值。能夠經過UpdateSourceTrigger屬性實現,具體有以下幾種值
成員名稱 |
說明 |
Default |
綁定目標屬性的默認 UpdateSourceTrigger 值。 大多數依賴項屬性的默認值都爲 PropertyChanged,而 Text 屬性的默認值爲 LostFocus。 肯定依賴項屬性的默認 UpdateSourceTrigger 值的編程方法是使用 GetMetadata 來獲取屬性的屬性元數據,而後檢查 DefaultUpdateSourceTrigger 屬性的值。 |
Explicit |
僅在調用 UpdateSource 方法時更新綁定源。 |
LostFocus |
當綁定目標元素失去焦點時,更新綁定源。 |
PropertyChanged |
當綁定目標屬性更改時,當即更新綁定源。 |
|
|
具體用法以下:
<TextBox Name="itemNameTextBox" Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />
接下來是本文的第一個示例,一個很是簡單的綁定示例,該示例演示如何經過綁定的方式把ListBox中選中的值顯示到 TextBlock中。
首先,給ListBox添加了七個 ListBoxItem,作爲ListBox的選項 。
其次,把第二個 TextBlock 的 Text經過 Binding 與 ListBox 選擇項進行綁定。Binding 語法中的 ElementName 屬性指示 TextBlock 的 Text 屬性要與其綁定的控件的名稱。Path 屬性指示咱們將綁定到Text屬性上ListBox元素的屬性。具體代碼以下。
<Window x:Class="WpfApp1.WindowBindData" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WindowBindData" Height="400" Width="500"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="150"/> <RowDefinition Height="150"/> <RowDefinition Height="138*"/> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <TextBlock Width="248" Height="24" Text="股票名稱:" TextWrapping="Wrap"/> <ListBox x:Name="listStockName" Width="248" Height="56"> <ListBoxItem Content="全通教育"/> <ListBoxItem Content="大智慧"/> <ListBoxItem Content="寶鋼股份"/> <ListBoxItem Content="浦發銀行"/> <ListBoxItem Content="工商銀行"/> <ListBoxItem Content="中國建築"/> <ListBoxItem Content="中國南車"/> </ListBox> <TextBlock Width="248" Height="24" Text="你所選中的股票名稱:" /> <TextBlock Width="248" Height="24" Text="{Binding ElementName=listStockName, Path=SelectedItem.Content}"> </TextBlock> </StackPanel> </Grid> </Window>
效果以下圖。