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