Binding(一):数据绑定
? ? 這節(jié)開(kāi)始分幾期來(lái)講一下WPF中Binding的相關(guān)用法,本節(jié)主要講使用Binding進(jìn)行數(shù)據(jù)綁定。
Binding的作用
????在WinForm中,我們要想對(duì)控件賦值,需要在后臺(tái)代碼中拿到控件對(duì)象進(jìn)行操作,這種賦值形式,從根本上是無(wú)法實(shí)現(xiàn)界面與邏輯分離的。在WPF中,微軟引入了Binding對(duì)象,通過(guò)Binding,我們可以直接將控件與數(shù)據(jù)做綁定,在后臺(tái)不用拿到控件對(duì)象,直接操作數(shù)據(jù)源,系統(tǒng)會(huì)自動(dòng)監(jiān)聽(tīng)數(shù)據(jù)源的變化實(shí)時(shí)的更新到控件上,相反的,用戶改變控件的值,也會(huì)實(shí)時(shí)更新到后臺(tái)數(shù)據(jù)源,這也就是我們之前所說(shuō)的,WPF天生支持MVVM模式。
數(shù)據(jù)綁定
????下面將通過(guò)一個(gè)實(shí)例來(lái)講解如何使用Binding進(jìn)行數(shù)據(jù)綁定,具體內(nèi)容如下:
????點(diǎn)擊按鈕“展示數(shù)據(jù)”時(shí),將數(shù)據(jù)顯示在上方文本框中。
????后臺(tái)代碼如下:
????我使用GetData方法模擬數(shù)據(jù),返回1-10的隨機(jī)數(shù),上圖所示的形式是使用控件對(duì)象直接賦值的方式。
????另外,您可能已經(jīng)注意到了,我實(shí)現(xiàn)了一個(gè)System.ComponentModel命名空間下的INotifyPropertyChanged接口,這個(gè)接口是實(shí)現(xiàn)數(shù)據(jù)綁定后臺(tái)必須要繼承的接口,從它的字面意思我們也可以知道這個(gè)接口是用于通知屬性已經(jīng)改變,這個(gè)接口內(nèi)部有一個(gè)PropertyChanged的事件,我們需要在每個(gè)要綁定的屬性的set中調(diào)用它,就如上圖Data屬性中:
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Data"));????這句代碼,它的意思就是通知系統(tǒng),我的Data屬性改變了,系統(tǒng)收到這個(gè)通知,會(huì)及時(shí)找到跟這個(gè)屬性Binding的前臺(tái)控件及時(shí)的更新值,下面演示使用Binding進(jìn)行數(shù)據(jù)綁定:
????我們需要在構(gòu)造器中先設(shè)置綁定,新建Binding對(duì)象,設(shè)置它的源和路徑,意思就是去哪個(gè)地方找哪個(gè)屬性,最后通過(guò)BindingOperations.SetBinding這個(gè)方法將綁定設(shè)置到控件,這樣我在Button的事件處理器中只管對(duì)Data賦值,系統(tǒng)會(huì)自動(dòng)更新到控件,這也是WPF中的數(shù)據(jù)驅(qū)動(dòng)控件。
????另外,Binding對(duì)象還有個(gè)Mode屬性,它是BindingMode枚舉,枚舉內(nèi)容如下圖:
??? OneWay:指示數(shù)據(jù)只從源到控件,用戶手動(dòng)改變控件的值,系統(tǒng)不會(huì)更新到源,它跟OneWayToSource是相反的,后者是數(shù)據(jù)只從控件到源;
??? TwoWay:則是數(shù)據(jù)可以在控件和源雙方流通;
????Default:默認(rèn)值,一般是TwoWay;
????OneTime:顧名思義,數(shù)據(jù)只會(huì)流通一次;
????SetBinding方法中有三個(gè)參數(shù),第一個(gè)和最后一個(gè)參數(shù)是要綁定的控件對(duì)象和Bingding對(duì)象,第二個(gè)參數(shù)是控件對(duì)象的依賴屬性,指示綁定的數(shù)據(jù)要賦值給控件的哪個(gè)屬性,此處要說(shuō)明一下,只有控件的依賴屬性才可以使用數(shù)據(jù)綁定,關(guān)于依賴屬性,會(huì)在后續(xù)的章節(jié)解釋。
????運(yùn)行起來(lái),點(diǎn)擊按鈕后,效果如下:
????在實(shí)際開(kāi)發(fā)中,我們一般會(huì)將綁定的這塊代碼寫在通過(guò)XAML標(biāo)記擴(kuò)展的形式寫在Xaml頁(yè)面中,那么構(gòu)造器中關(guān)于綁定的代碼就可以刪掉,改為如下代碼:
public?MainWindowBase() {InitializeComponent();this.DataContext = this;//Binding binding = new Binding();//binding.Source = this; //binding.Path = new PropertyPath("Data");//BindingOperations.SetBinding(this.text_show, TextBox.TextProperty, binding); } <TextBox?x:Name="text_show"?Text="{Binding?Path=Data}"?/>??? 在前臺(tái)使用標(biāo)記擴(kuò)展綁定數(shù)據(jù),需要后臺(tái)配置前臺(tái)的數(shù)據(jù)上下文,就是this.DataContext對(duì)象。
????標(biāo)記擴(kuò)展中,使用Binding命令指示數(shù)據(jù)綁定,Path屬性是默認(rèn)值,可以省略,Source也可以省略,默認(rèn)DataContext對(duì)象,這樣就極大的簡(jiǎn)化了代碼。
????總結(jié)起來(lái),使用Binding的流程是:
????????1.實(shí)現(xiàn)INotifyPropertyChanged接口
????????2.為需要綁定的屬性的set塊添加PropertyChanged事件通知
????????3.在構(gòu)造器(不一定是構(gòu)造器,可以是任何一個(gè)早于您使用數(shù)據(jù)綁定情景之前的方法中)中綁定數(shù)據(jù)源 或者?使用XAMl的標(biāo)記擴(kuò)展綁定數(shù)據(jù)源
本節(jié)到此結(jié)束...
總結(jié)
以上是生活随笔為你收集整理的Binding(一):数据绑定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Binding(二):控件关联和代码提升
- 下一篇: 你也可以搞懂的微服务第一篇——来自Tho