這節開始分幾期來講一下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進行數據綁定:
publicMainWindowBase()
{
InitializeComponent();
Binding binding = new Binding();
binding.Source = this;
binding.Path = new PropertyPath("Data");
BindingOperations.SetBinding(this.text_show, TextBox.TextProperty, binding);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Data = GetData();
}
我們需要在構造器中先設置綁定,新建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的標記擴展綁定數據源

