Binding(一):資料繫結

Charles_Su發表於2021-06-20

    這節開始分幾期來講一下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的標記擴充套件繫結資料來源

 

相關文章