今天記錄一下Binding的基礎和具體的使用方法,說起這個Binding,在WPF中,Binding是很重要的特征,在傳統的Windows軟體來看,大多數都是UI驅動程式的模式,也可以說事件驅動程式,這個程式模式在工作過幾年的程式員中是根深蒂固的,WPF作為Winform的升級,它把UI驅動程式徹底 ...
今天記錄一下Binding的基礎和具體的使用方法,說起這個Binding,在WPF中,Binding是很重要的特征,在傳統的Windows軟體來看,大多數都是UI驅動程式的模式,也可以說事件驅動程式,這個程式模式在工作過幾年的程式員中是根深蒂固的,WPF作為Winform的升級,它把UI驅動程式徹底改變了,核心回到了數據驅動程式的模式上面,這樣,程式就回到了演算法和數據。數據,才是真正需要重點處理的!
Binding在數據驅動程式模式中起著至關重要的作用,它最為重要的一個特點就是通訊,連接著前臺與後臺。首先看一下Binding最簡單的使用方法:
這裡有3個控制項,Slider,TextBox,Label,其中TextBox和Label都作為目標,Slider都作為數據源,把Slider中的值交由兩個控制項體現,移動滑塊,TextBox會自動顯示Value的值,也就是FontSize的值。因為兩個綁定都設置了雙向綁定,所以可以在文本框中輸入值,然後丟失焦點,也能反饋回去。
看一下XAML中的綁定語句,這裡用的ElementName就是制定要綁定的對象的名字,Path就是要綁定的依賴項屬性,mode就是綁定方式,這裡需要說明的是mode有五種方式:
(3)OneTime,最初根據源屬性值設置目標屬性,以後就忽略所有改變,就是說,只進行初始化。
(5)Default,這是預設形式,它根據目標屬性自動設置。
如果把TextBox中的值修改成其他的,滑條位置沒有改變,字體大小也沒有改變,這是什麼回事呢?當TextBox失去焦點的時候,就會發生相應的改變了。這是因為這個綁定中的預設更新機制,更新機制Binding.UpdateSourceTrigger,這個屬性有4個枚舉值
(1)PropertyChange,當值改變的時候,就更新。
(3)Explicit,當調用BingingExpression.UpdateSource()方法的使用更新,其他情況不會更新。
註意:以上這四種更新機制的設定,只會影響源數據,而不會影響目標數據。
除了可以綁定別的元素,也可以綁定自身的其他屬性,例如Slider自身的Opacity屬性和自身的Value屬性綁定,當滑塊向左移動的時候,會逐漸隱藏起來。
前面說了元素之間的綁定和元素自身的綁定,最後重點來了後臺數據和前臺元素的綁定,這種綁定方式很好地體現了數據驅動程式的運行模式。
數據的綁定的方式已經寫完了。Binding是一條高速公路,那麼為了提高數據傳遞的合法性和有效性,我們要在這條高速公路中建立起一系列的關卡,有的用來轉換數據,有的用來校驗數據,下麵就說一下Binding對數據的校驗和轉換。
Binding的數據校驗工作是派生自ValidationRule類,並且對Validate方法進行重寫的自定義類!看一下實例:
先設計一個檢驗類,它繼承ValidationRule類並且重寫Validate方法。使用這個類的時候是創建Binding的時候設置校驗的。
因為設置了值傳過去的值不能是超過0~100之間,所以當超過了就顯示紅色邊框。在Binding中,預設是會認為數據源是肯定正確的,所以如果將TextBox作為數據源,而Slider作為目標,數據源輸入錯誤是沒有顯示的,那麼怎麼解決這個問題呢,設置VdataValidationRule.ValidatesOnTargetUpdated = true;
Binding還有另外一種機制稱為數據轉換,當Source端指定的Path屬性值和Target端指定的目標屬性不一致的時候,我們可以添加數據轉換器(Convert)。上面我們提到的問題實際上就是double和stirng類型相互轉換的問題,因為處理起來比較簡單,所以WPF類庫就自己幫我們做了,但有些數據類型轉換就不是WPF能幫我們做的了,當遇到這些情況,我們只能自己動手寫Converter,方法是創建一個類並讓這個類實現IValueConverter介面。
2.當值從綁定目標傳播給綁定源時,調用此方法ConvertBack,方法ConvertBack的實現必須是方法Convert的反向實現。
這兩個方法分別在裡面寫入怎麼轉換,轉換成什麼類型就是返回類型。
好了,把這個綁定的Converter屬性設置成我們設計的轉換類的實例就可以了。看一下程式的界面