WPF實(shí)現(xiàn)數(shù)據(jù)綁定
簡單而言, 數(shù)據(jù)綁定是一種關(guān)系, 這種關(guān)系告訴WPF 從一個(gè)源目標(biāo)對(duì)象中提取一些信息, 并且使用該信息設(shè)置為目標(biāo)對(duì)象的屬性。目標(biāo)屬性總是依賴項(xiàng)屬性, 并且通常位于WPF元素中。
然而, 源對(duì)象可以是任何內(nèi)容, 可是是隨機(jī)生成的一個(gè)對(duì)象、也可以是數(shù)據(jù)庫的數(shù)據(jù)對(duì)象,或者手動(dòng)創(chuàng)建的對(duì)象。
簡單綁定
為了能夠簡單理解這種綁定關(guān)系, 接下來簡單示例, 用一個(gè)數(shù)值滾動(dòng)條, 動(dòng)態(tài)修改一個(gè)文字的字體大小, 通過綁定的方式。
<StackPanel>
<Slider Name="s1" Value="10" Maximum="100"></Slider>
<TextBlock FontSize="{Binding ElementName=s1,Path=Value}" Text="看著我" ></TextBlock>
</StackPanel>上圖中, TextBlock的字體大小FontSize通過綁定的形式與名稱為s1的元素的Value屬性綁定。
注:數(shù)據(jù)綁定表達(dá)式使用了XAML標(biāo)記擴(kuò)展, 所以綁定表達(dá)式以單詞Binding 開頭。該示例中設(shè)置的兩個(gè)屬性: ElementName(源對(duì)象元素) 和Path(源對(duì)象元素中的屬性)。
運(yùn)行測試效果:

綁定錯(cuò)誤
WPF不會(huì)引發(fā)異常來通知與數(shù)據(jù)綁定相關(guān)的問題, 如果指定的元素不存在或錯(cuò)誤, 不會(huì)收到任何提示, 最簡單的只是目標(biāo)的屬性無法發(fā)生改變, 不過, WPF仍然會(huì)在輸出窗口顯示其綁定失敗的具體細(xì)節(jié)。
綁定模式
在上面的示例中, 只是一個(gè)最簡單的綁定, 我們可以假設(shè)一個(gè)環(huán)境, 在上面的例子基礎(chǔ)上另外加一個(gè)按鈕, 去單獨(dú)實(shí)現(xiàn)字體的大小設(shè)置, 然而拖動(dòng)條并不會(huì)隨著按鈕設(shè)置的字體大小而改動(dòng)。
但是在實(shí)際應(yīng)用中, 我們甚至?xí)玫降亩喾N綁定模式, 所以在WPF中, 含有5種綁定的模式, 包含在System.Windows.Data.BindingMode枚舉中。
| OneWay | 當(dāng)源屬性變化時(shí)更新目標(biāo)屬性 |
| TwoWay | 當(dāng)源數(shù)據(jù)變化時(shí)更新目標(biāo)屬性, 并且當(dāng)目標(biāo)屬性變化時(shí)更新源屬性 |
| OneTime | 最初根據(jù)源屬性值設(shè)置目標(biāo)屬性。然而, 在此之后的所有改變都會(huì)被忽略(除非綁定被設(shè)定為一個(gè)完全不同的對(duì)象或者調(diào)用BindingExpression.UpdateTarget()方法, 如稍后所介紹的那樣)。通常, 如果知道源屬性不會(huì)變化, 可以使用這種模式降低開銷。 |
| OneWayToSource | 和OneWay 類似, 但是方向相反。當(dāng)目標(biāo)屬性變化時(shí)更新源屬性(這看起來有點(diǎn)像向后傳遞),但目標(biāo)屬性永遠(yuǎn)不會(huì)更新。 |
| Default | 此類綁定依賴于目標(biāo)屬性。它既可以是雙向的(對(duì)于用戶設(shè)置的屬性, 如Textbox.Text屬性),也可以是單向的(對(duì)于所有其他屬性)。除非明確指定了另外一種模式, 否則所有綁定都使用該方法。 |
在此, 對(duì)于OneTime設(shè)置過一次就無效,和默認(rèn)default模式就不過多介紹, 下面對(duì)其他集中進(jìn)行簡單分析:

利用代碼進(jìn)行數(shù)據(jù)綁定
下面代碼演示如何將上面的示例進(jìn)行綁定:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Binding bind = new Binding();
bind.Source = s1; //指定源對(duì)象
bind.Mode = BindingMode.Default; //設(shè)置綁定模式
bind.Path = new PropertyPath("Value"); //關(guān)聯(lián)綁定的屬性
txtfont.SetBinding(TextBlock.FontSizeProperty, bind); //綁定對(duì)象
}下面代碼演示如何解除數(shù)據(jù)綁定:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//刪除指定目標(biāo)對(duì)象的 指定屬性數(shù)據(jù)綁定
BindingOperations.ClearBinding(txtfont, TextBlock.FontSizeProperty);
//刪除指定目標(biāo)對(duì)象的所有數(shù)據(jù)綁定
BindingOperations.ClearAllBindings(txtfont);
}注意:以上的兩個(gè)移除數(shù)據(jù)綁定的方法, 可以刪除任何形式的綁定, 無論是代碼創(chuàng)建的綁定還是通過XAML標(biāo)記的綁定。
綁定更新:
在上面的示例中, 從 源對(duì)象 -> 目標(biāo)對(duì)象, 源對(duì)象的值發(fā)生改變, 目標(biāo)會(huì)立刻響應(yīng)。但是從目標(biāo) > 源 , 未必會(huì)立即發(fā)生。
在WPF中,他們的行為右 binding中的 UpdateSourceTrigger屬性控制, 關(guān)于UpdateSourceTrigger 下面列出了對(duì)應(yīng)的枚舉值
| propertyChanged | 當(dāng)目標(biāo)屬性發(fā)生變化時(shí)立即更新源目標(biāo) |
| LostFocus | 當(dāng)目標(biāo)屬性發(fā)生變化時(shí)并且目標(biāo)丟失焦點(diǎn)是更新源目標(biāo) |
| Explicit | 除非調(diào)用BindingExpression.UpdateSource()方法,否則無法更新資源 |
| Default | 根據(jù)目標(biāo)屬性的元數(shù)據(jù)確定更新行為, 大多數(shù)屬性的默認(rèn)行為是PropertyChanged, 但是TextBox.Text的屬性默認(rèn)行為是LoastFocus |
示例, 對(duì)于TextBox控件, 添加 UpdateSourceTrigger=PropertyChanged 以達(dá)到更新源目標(biāo), 但是往往在實(shí)際應(yīng)用中, TextBox會(huì)頻繁的變化, 從而導(dǎo)致多次更新源目標(biāo),
PropertyChenged更新反而會(huì)是應(yīng)用程序運(yùn)行更加緩慢, 要完全控制源對(duì)象的更新時(shí)機(jī), 可以選擇 Explicit模式, 例如, 添加一個(gè)按鈕, 在按鈕中調(diào)用UpdateSource方法已達(dá)到
更新的目的。
<TextBlock Grid.Row="1" Text="看著我" Name="txtfont"></TextBlock>
<TextBox Grid.Row="2" Margin="10" Text="{Binding ElementName=txtfont,Path=FontSize,UpdateSourceTrigger=PropertyChanged}"></TextBox>注:在調(diào)用UpdateSource之前, 需要通過GetBindingExpression()方法獲取到BindingExpression對(duì)象, 從而調(diào)用UpdateSource()方法。
private void Button_Click(object sender, RoutedEventArgs e)
{
BindingExpression exp = txtfont.GetBindingExpression(TextBlock.FontSizeProperty);
exp.UpdateSource();
}非元素綁定:
在上面的例子中, 一直圍繞著元素之間的綁定, 以及一些綁定的模式的介紹, 但是在我們的實(shí)際應(yīng)用當(dāng)中, 更多的是于數(shù)據(jù)打交道, 就像常見的Grid表格, 需要綁定對(duì)應(yīng)數(shù)據(jù)庫表的每個(gè)字段。
當(dāng)綁定一個(gè)非元素對(duì)象時(shí)候, 這個(gè)時(shí)候就不能使用 ElementName屬性, 在WPF中, 提供了多種屬性以在實(shí)際應(yīng)用中選擇:
| Source | 提供數(shù)據(jù)的對(duì)象本身 |
| RelativeSource | 使用RelativeSource對(duì)象指向源目標(biāo), |
| DataContext | 從當(dāng)前元素向下, 找到第一個(gè)非空的DataContext屬性。 |
Source屬性:
如下, 我們定義了一個(gè)Custom的資源對(duì)象, 同時(shí)創(chuàng)建了一個(gè)TextBlock對(duì)象用Source進(jìn)行了對(duì)象綁定, 此時(shí), TextBlock顯示的Text則為Tom
<Window.Resources>
<FontFamily x:Key="Custom">Tom</FontFamily>
</Window.Resources>
<StackPanel>
<TextBlock Text="{Binding Source={StaticResource Custom},Path=Source}" Height="30"/>
</StackPanel>RelativeSource屬性:
如下, 定義了一個(gè)RelativeSource對(duì)象, Mdoe選擇了FindAncestor(該模式通知元素直到發(fā)現(xiàn)AncestorType定義的元素類型,如下類型為 window),選擇的Paht為title屬性
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}},Path=Title}" Height="30"/>
</StackPanel>DataContext屬性:
TextBlock綁定了DataContext屬性, WPF會(huì)在元素樹種,找到第一個(gè)不為null的數(shù)據(jù)上下文, 此時(shí)后臺(tái)需要對(duì)DataContext進(jìn)行綁定指定的上下文對(duì)象。
<TextBlock Text="{Binding Width}"/>該示例種, 綁定了自身為上下文對(duì)象, 所有TextBlock找到的第一個(gè)Width屬性為windows窗體本身的Width屬性
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = this;
}到此這篇關(guān)于WPF實(shí)現(xiàn)數(shù)據(jù)綁定的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一步一步學(xué)asp.net Ajax登錄設(shè)計(jì)實(shí)現(xiàn)解析
做一個(gè)登錄,擁有自動(dòng)記住賬號(hào)和密碼的功能,要保證安全性,ajax,無刷新,良好的用戶體驗(yàn).(母板頁)2012-05-05
詳解ASP.NET Core和ASP.NET Framework共享身份驗(yàn)證
本篇文章主要介紹了詳解ASP.NET Core和ASP.NET Framework共享身份驗(yàn)證 ,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
ASP.NET全棧開發(fā)教程之在MVC中使用服務(wù)端驗(yàn)證的方法
這篇文章主要給大家介紹了關(guān)于ASP.NET全棧開發(fā)教程之在MVC中使用服務(wù)端驗(yàn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
ASP.NET Core應(yīng)用錯(cuò)誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開發(fā)者
這篇文章主要給大家介紹了關(guān)于ASP.NET Core應(yīng)用錯(cuò)誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開發(fā)者異常頁面”的相關(guān)資料,需要的朋友可以參考下2019-01-01
ASP.NET?Core中使用滑動(dòng)窗口限流的問題及場景分析
這篇文章主要介紹了ASP.NET?Core中使用滑動(dòng)窗口限流的問題,主要介紹服務(wù)限流場景中的應(yīng)用,如何使用滑動(dòng)窗口來解決這個(gè)問題,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-12-12
ASP.NET+Web服務(wù)實(shí)現(xiàn)軟件共享
ASP.NET+Web服務(wù)實(shí)現(xiàn)軟件共享...2006-09-09
基于自定義Unity生存期模型PerCallContextLifeTimeManager的問題
本篇文章小編將為大家介紹,基于自定義Unity生存期模型PerCallContextLifeTimeManager的問題。需要的朋友參考下2013-04-04

