1. 程式人生 > 其它 >WPF繫結(4)

WPF繫結(4)

什麼是繫結(Binding)?

在winform中, 我們常常會用到各種型別的賦值, 例如:

  • button1.Text="Hello";
  • label.Text="Hello";
  • ...

類似這種賦值操作, 我們之所以不稱之為繫結, 主要原因是因為他們大多數操作都是一次性的, 無論是資料還是按鈕本身發生變化,對兩者而言都是不可見的。
而繫結的概念則側重於: 兩者的關聯,協議與兩者之間的影響。
首先, 從一個簡單的例子來理解什麼是繫結。

  • 建立一個滑塊控制元件, 並且希望在滑動的過程中, 把值更新到另外一個靜態文字上。程式碼如下:

在winform中, 我們常規的做法會給滑塊建立一個值改變事件,同時將滑塊的值賦值給文字。
接下來, 我只需要在靜態文字中新增一小段繫結的宣告,即可完整原本很複雜的操作:

  • Text={Binding ElementName=slider,Path=Value}
    • {Binding }: Binding的宣告語法, 一對尖括號,開頭宣告以Binding 開始。
    • ElementName= : 該宣告意為, 設定元素的名稱
    • Path: 設定關聯元素的位置,上例中設定為元素的value屬性。

那麼該如何理解整句話的意義, 翻譯: 靜態文字TextBlock的Text屬性將通過繫結的方式關聯到元素名'slider'的value屬性上。

效果圖所示:

可以看到,在滑塊不斷的滑動過程中, TextBlock也在不斷的發生變化, 說明TextBlock已經得到了滑動滑動過程中的值變化, 這種關聯, 我們稱之為繫結, 在WPF當中, 繫結又分很多種, 而上面這種則是通過元素繫結的方式。
理解了基礎的繫結之後,然後就是理解繫結的模式。

繫結的模式就類似我們商業中的合作, 是一次性回報還是持續獲益, 是否可以單方面終止, 是否具有投票權等, 在WPF中繫結的模式又分為五種:

  • OneWay(單向繫結) : 當源屬性發生變化更新目標屬性, 類似上面的例子中, 滑動變化更新文字的資料。示例:

    效果:
  • TwoWay(雙向繫結) : 當源屬性發生變化更新目標屬性, 目標屬性發生變化也更新源屬性。
    • 與單向繫結的區別可以理解為, 前者只能打你,被打者不能還手, 雙向繫結的意思則是: 你敢打我一巴掌,我也能回你一巴掌。示例:

      效果:
  • OneTime(單次模式) : 根據第一次源屬性設定目標屬性, 在此之後所有改變都無效。
    • 如第一次綁定了資料來源為0, 那麼無論後面如何改變 2、3、4... 都無法更新到目標屬性上。示例:

      效果:
  • OneWayToSource : 和OneWay型別, 只不過整個過程倒置。示例:

    效果:
  • Default : 既可以是雙向,也可以是單項, 除非明確表明某種模式, 否則採用該預設繫結

繫結到非元素上

上面的程式碼中,使用的繫結方式是根據元素的方式: ElementName=xxx, 如需繫結到一個非元素的物件, 則有一下幾屬性:

  • Source : 指向一個數據源, 示例, TextBox使用繫結的方式用Source指向一個靜態資源ABC:
  • RelativeSource : 使用一個名為RelativeSource的物件來根據不同的模式查詢源物件,

示例, 使用RelativeSource的FindAncestor模式, 查詢父元素為StackPanel的Width值

  • DataContext: 從當前的元素樹向上查詢到第一個非空的DataContext屬性為源物件。

示例, 該示例用後臺程式碼建立一個只包含Name的類, Test, 通過繫結視窗的DataContext上下文:

後臺程式碼繫結簡單文字與列表

建立一個PageModel類, 定一個ClassName為班級名稱, 和一個Students學生列表, 後臺程式碼:

視窗程式碼

效果預覽


關於以上, 基本介紹了WPF元素繫結的方式與幾種模式, 接下講的是, WPF中的事件如果通過繫結的方式和UI分離。儘管WPF中仍然可以相容winform中的事件模型, 而binding也是MVVM架構中的重要組成部分(下節會介紹)。