WPF入门教程系列十五——WPF中的数据绑定(一)
?? 使用Windows Presentation Foundation (WPF) 可以很方便的設(shè)計(jì)出強(qiáng)大的用戶界面,同時(shí) WPF提供了數(shù)據(jù)綁定功能。WPF的數(shù)據(jù)綁定跟Winform與ASP.NET中的數(shù)據(jù)綁定功能類(lèi)似,但也有所不同,在 WPF中以通過(guò)后臺(tái)代碼綁定、前臺(tái)XAML中進(jìn)行綁定,或者兩者組合的方式進(jìn)行數(shù)據(jù)綁定。您可以綁定控件、公共屬性、XML 或?qū)ο?#xff0c;WPF中的數(shù)據(jù)綁定跟WinForm與ASP.NET相比,更加快捷、靈活和簡(jiǎn)單。
一、什么是數(shù)據(jù)綁定
??? WPF 中的數(shù)據(jù)綁定,必須要有綁定目標(biāo)和要綁定的數(shù)據(jù)源。綁定目標(biāo)可以是繼承自 DependencyProperty的任何可訪問(wèn)的屬性或控件,例如 TextBox 控件的 Text 屬性。數(shù)據(jù)源可以是其他控件的屬性,可以是對(duì)象實(shí)例、XAML 元素、ADO.NET Dataset、XML數(shù)據(jù)。微軟針對(duì)XML綁定與對(duì)象綁定,提供了兩個(gè)輔助類(lèi)XmlDataProvider 和 ObjectDataProvider。
??? WPF的數(shù)據(jù)綁定跟ASP.NET與WinForm中的數(shù)據(jù)綁定有什么不同呢? 最大不同就是WPF使用{Binding …}這一語(yǔ)句。?
Binding是用來(lái)實(shí)現(xiàn)界面控件的屬性與后臺(tái)數(shù)據(jù)之間的綁定,通過(guò)這種形式將前臺(tái)界面與后臺(tái)數(shù)據(jù)聯(lián)系在一起達(dá)到界面與數(shù)據(jù)耦合的目的。
WPF綁定引擎從 Binding 對(duì)象獲取有關(guān)以下內(nèi)容的信息:
??? 源對(duì)象和目標(biāo)對(duì)象。
??? 數(shù)據(jù)流的方向。你可以通過(guò)設(shè)置 Binding.Mode 屬性來(lái)指定該方向。
??? 值轉(zhuǎn)換器(如果存在)。你可通過(guò)將 Converter 屬性設(shè)置為用來(lái)實(shí)現(xiàn) IValueConverter 的類(lèi)的一個(gè)實(shí)例,指定值轉(zhuǎn)換器。?
??? WPF與ASP.NET與WinForm中的綁定方式比較,存在著如下幾點(diǎn)差異:
?? (1)Binding可以通過(guò)XAML語(yǔ)句實(shí)現(xiàn)界面與數(shù)據(jù)的耦合。如果把Binding比作數(shù)據(jù)的橋梁,那么它的兩端分別是Binding的源和目標(biāo)。數(shù)據(jù)從哪里來(lái)哪里就是源,Binding是架在中間的橋梁,Binding目標(biāo)是數(shù)據(jù)要往哪兒去。一般情況下,Binding源是邏輯層的對(duì)象,Binding目標(biāo)是UI層的控件對(duì)象,這樣,數(shù)據(jù)就會(huì)源源不斷 通過(guò)Binding送達(dá)UI層,被UI層展現(xiàn),也就完成了數(shù)據(jù)驅(qū)動(dòng)UI的過(guò)程。如下圖。
?
?? (2)Binding有一個(gè)重要的屬性Mode,實(shí)現(xiàn)綁定中的數(shù)據(jù)流向。具體有如下幾種。
?
| 成員名稱 | 說(shuō)明 |
| Default | 使用綁定目標(biāo)的默認(rèn) Mode 值。 每個(gè)依賴項(xiàng)屬性的默認(rèn)值都不同。 一般情況下,用戶可編輯控件屬性(例如文本框和復(fù)選框的屬性)默認(rèn)為雙向綁定,而多數(shù)其他屬性默認(rèn)為單向綁定。 確定依賴項(xiàng)屬性綁定在默認(rèn)情況下是單向還是雙向的編程方法是:使用 GetMetadata 獲取屬性的屬性元數(shù)據(jù),然后檢查 BindsTwoWayByDefault 屬性的布爾值。 |
| ?OneTime | 當(dāng)應(yīng)用程序啟動(dòng)或數(shù)據(jù)上下文更改時(shí),更新綁定目標(biāo)。 此綁定類(lèi)型適用于以下情況:使用當(dāng)前狀態(tài)的快照適合使用的或數(shù)據(jù)狀態(tài)實(shí)際為靜態(tài)的數(shù)據(jù)。 如果要從源屬性初始化具有某個(gè)值的目標(biāo)屬性,并且事先不知道數(shù)據(jù)上下文,則也可以使用此綁定類(lèi)型。 此綁定類(lèi)型實(shí)質(zhì)上是 OneWay 綁定的簡(jiǎn)化形式,在源值不更改的情況下可以提供更好的性能。 |
| OneWay | 當(dāng)綁定源(源)更改時(shí),更新綁定目標(biāo)(目標(biāo))屬性。 此綁定類(lèi)型適用于綁定的控件為隱式只讀控件的情況。 例如,可以綁定到如股市代號(hào)之類(lèi)的源。 或者,可能目標(biāo)屬性沒(méi)有用于進(jìn)行更改(例如表的數(shù)據(jù)綁定背景色)的控件接口。 如果無(wú)需監(jiān)視目標(biāo)屬性的更改,則使用 OneWay 綁定模式可避免 TwoWay 綁定模式的系統(tǒng)開(kāi)銷(xiāo)。 |
| OneWayToSource | ?當(dāng)目標(biāo)屬性更改時(shí)更新源屬性。 |
| ?TwoWay | 導(dǎo)致對(duì)源屬性或目標(biāo)屬性的更改可自動(dòng)更新對(duì)方。 此綁定類(lèi)型適用于可編輯窗體或其他完全交互式 UI 方案。 |
?
??? (3)可通過(guò)配置觸發(fā)器,決定用戶在界面輸入的數(shù)據(jù)在什么時(shí)候去修改數(shù)據(jù)源中的值??梢酝ㄟ^(guò)UpdateSourceTrigger屬性實(shí)現(xiàn),具體有如下幾種值
?
| 成員名稱 | 說(shuō)明 |
| Default | 綁定目標(biāo)屬性的默認(rèn) UpdateSourceTrigger 值。 大多數(shù)依賴項(xiàng)屬性的默認(rèn)值都為 PropertyChanged,而 Text 屬性的默認(rèn)值為 LostFocus。 確定依賴項(xiàng)屬性的默認(rèn) UpdateSourceTrigger 值的編程方法是使用 GetMetadata 來(lái)獲取屬性的屬性元數(shù)據(jù),然后檢查 DefaultUpdateSourceTrigger 屬性的值。 |
| Explicit | 僅在調(diào)用 UpdateSource 方法時(shí)更新綁定源。 |
| LostFocus | 當(dāng)綁定目標(biāo)元素失去焦點(diǎn)時(shí),更新綁定源。 |
| PropertyChanged | 當(dāng)綁定目標(biāo)屬性更改時(shí),立即更新綁定源。 |
| ? | ? |
?
?? 具體用法如下:
<TextBox Name="itemNameTextBox"Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />?
?
二、簡(jiǎn)單的綁定
??? 接下來(lái)是本文的第一個(gè)示例,一個(gè)非常簡(jiǎn)單的綁定示例,該示例演示如何通過(guò)綁定的方式把ListBox中選中的值顯示到 TextBlock中。
??? 首先,給ListBox添加了七個(gè) ListBoxItem,做為L(zhǎng)istBox的選項(xiàng) 。
??? 其次,把第二個(gè) TextBlock 的 Text通過(guò) Binding 與 ListBox 選擇項(xiàng)進(jìn)行綁定。Binding 語(yǔ)法中的 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="浦發(fā)銀行"/><ListBoxItem Content="工商銀行"/><ListBoxItem Content="中國(guó)建筑"/><ListBoxItem Content="中國(guó)南車(chē)"/></ListBox><TextBlock Width="248" Height="24" Text="你所選中的股票名稱:" /><TextBlock Width="248" Height="24" Text="{Binding ElementName=listStockName, Path=SelectedItem.Content}"></TextBlock></StackPanel></Grid></Window>效果如下圖。
?
總結(jié)
以上是生活随笔為你收集整理的WPF入门教程系列十五——WPF中的数据绑定(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CentOS 7.0变动
- 下一篇: .NET APlayer播放器 demo