說到WPF, 固然得從綁定提及,這也是WPF作的很成功的一個地方,這也是如今你們夥都在拋棄使用winform的其中一個主要緣由,Binding這個東西從早說到完其實都說不完的,我先就作一些基本的介紹,在咱們的項目中將會使用到的一些狀況,至於一些比較深層次,不怎麼會常用的到用的時候再具體介紹,其實都是一個道理,觸類旁通基本都同樣的,這也使萬物起源的一個邏輯,任何東西都有一個核心的運做思想。html
在這以前,我想你們夥能夠先看看WPF Visual Tree的一個結構,這樣在你寫UI的代碼的時候會有一個比較清晰的認知。windows
想實現一個綁定的話,就得有一個數據源和一個你須要綁定的對象,數據源能夠是你DataContext裏的某個對象,或者是其它元素的一些DP(依賴屬性)的值。綁定的目標(你想要綁定的對象)這個就看你像幹什麼了。框架
這個系統將使用的一套完整的MVVM框架模式,並且會把View和ViewModel徹底解耦,若是你在UI中想綁定一個.NET屬性或者對象的話,那你的ViewModel必須實現INotifyPropertyChanged,關於這個我後面會有一個比較系統的介紹,怎樣去封裝這樣一個機制,這樣會更好管理和拓展,你們先不用着急瞭解這麼多,先把基礎的一些概念弄清楚最好,磨刀不誤砍柴工是吧。spa
下面我就介紹下Bingding的一些基本概念:.net
Bingding的源介紹:有三個屬性用來設置源:component
{orm
ElementName: 源爲一個元素(Element),這裏用的是此元素中設置的Name屬性,好比你設置一個Grid x:Name = "Grid", 而後你想把Textbox的寬度和Grid的寬度綁定在一塊兒,那你能夠在textbox裏這樣寫htm
Width="{Binding ElementName=Grid,Path=ActualWidth}",這樣Textbox的Width就會按照Grid的寬度來更新,下面我會介紹下Path是什麼。對象
Source:以object做爲源。<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/> 這個我不多用,通常用RelativeSource居多,會比較靈活一點blog
RelativeSource: 源相對於綁定目標的位置。
源是元素自己:{Binding RelativeSource={RelativeSource Self}}
源是Tempalte中元素的Parent:{Binding RelativeSource={RelativeSource TemplatedParent}}
源是綁定以collection形式的前一個數據:{Binding RelativeSource={RelativeSource PreviousData}},MSDN上關於PreviousData的說明並很少,這裏有一篇文章能夠參考
以上三項爲RelativeSource中的Static值,使用這些值能夠減小內存開銷
源是Ancestor(可能比parent還高):{Binding RelativeSource={RelativeSource FindAncestor,
AncestorLevel=n, AncestorType={x:Type desiredType}}}
}
Binding中的Path是 PropertyPath對象。
在最簡單的狀況下,Path 屬性值是要用於綁定的源對象的屬性名稱,如 Path=PropertyName。
經過相似於 C# 中使用的語法,能夠指定屬性的子屬性。例如,子句 Path=ShoppingCart.Order 將綁定設置爲對象的子屬性 Order 或屬性 ShoppingCart。
若要綁定到附加屬性,請將附加屬性用括號括起。例如,若要綁定到附加屬性 DockPanel.Dock,則語法爲 Path=(DockPanel.Dock)。
在應用了索引器的屬性名稱以後的方括號內,能夠指定屬性的索引器。例如,子句 Path=ShoppingCart[0] 將綁定設置爲與屬性的內部索引處理文本字符串「0」的方式對應的索引。此外,還支持多個索引器。
在 Path 子句中能夠同時使用索引器和子屬性,例如,Path=ShoppingCart.ShippingInfo[MailingAddress,Street]。
在索引器內部,能夠有多個由逗號 (,) 分隔的索引器參數。可使用圓括號指定每一個參數的類型。例如,可使用 Path="[(sys:Int32)42,(sys:Int32)24]",其中 sys 映射到 System 命名空間。
若是源爲集合視圖,則能夠用斜槓 (/) 指定當前項。例如,子句 Path=/ 設置到視圖中當前項的綁定。若是源爲集合,則此語法指定默認集合視圖的當前項。
能夠結合使用屬性名和斜槓來遍歷做爲集合的屬性。例如,Path=/Offices/ManagerName 指定源集合的當前項,該源集合包含一樣是集合的 Offices 屬性。其當前項是包含 ManagerName 屬性的對象。
也可使用句點 (.)路徑綁定到當前源。例如,Text=」{Binding}」 等效於 Text=」{Binding Path=.}」。
這是一個基礎概念,大概知道就行,Binding 類是高級別類。BindingExpression 類是基礎對象,用於保持綁定源與綁定目標之間的鏈接。Binding 中包含可在多個 BindingExpression 對象之間共享的全部信息。也就是說,能夠把一個Binding對象綁定對n個元素上,而針對這n個元素,分別有相應的n個BindingExpresion對象。
Binding能夠直接綁定普通的.net實例,好比int值。可是若是後臺改變int值了,前臺不能顯示改變後的值,這時能夠調用UpdateTarget()方法更新綁定。以下:BindingExpression be = button.GetBindingExpression(Button.ContentProperty);
be.UpdateTarget();
指示源和目標間數據流的方向。
OneWay 源更新時,目標也更新
TwoWay 源更新時目標也更新,或者目標更新時同時更新源
OneTime 僅當應用程序啓動時或 DataContext 進行更改時更新目標屬性。綁一次就不更維護更新,目標至關於源的一次性鏡像
OneWayToSource 目標更新時更新源,和OneWay相反
大部分WPF自帶的控件的dependency property默認的是OneWay,像TextBox.Text默認的是TwoWay。
值得注意的事,只讀屬性只能設置成OneWay,不能是TwoWay,不然運行時異常。
對於 OneWay 或 TwoWay 綁定,對源的動態更改不會自動傳播到目標。必須在源對象上實現 INotifyPropertyChanged 接口。
對於 TwoWay 綁定,對目標的更改不會自動傳播到源,除非綁定目標是 Text 屬性。在這種狀況下,更新僅在 TextBox 失去焦點時發生。
對於 OneTime 和 OneWay 綁定,對 SetValue 的調用會自動更改目標值並刪除綁定。
再次提醒,源要實現了INotifyPropertyChanged 接口才能把改變反映到目標上。
OneWayToSource 用於多個目標更改一個源的狀況,能夠想像成多人錄入。或者用來實現源和目標倒置的狀況。
在這裏順便提下UpdateSourceTrigger,這個你們先不用太關注,先知道在綁定的時候有這個東西
Binding.UpdateSourceTrigger
指示使用TwoWay或OneWayToSource時,目標在什麼狀況下更新源。有三個枚舉值
PropertyChanged:目標屬性改變時更新源
LostFocus:失去焦點時更新源
Explicit:只有在顯式調用BindingExpression.UpdateSource方法時才更新源。BindingExpression能夠經過BindingOperations.GetBindingExpression或FrameworkElement.GetBindingExpression方法得到
Binding類中提供了SourceUpdated和TargetUpdated事件,能夠用來記些log,不過必須相應的NotifyOnSourceUpdated或NotifyOnTargetUpdated設置成true纔會激發事件。
對於綁定的一些基本概念這裏基本上是介紹差很少了,還有關於UI上的一些輔助操做,好比驗證,數據轉換,之類的,後面在用到的時候我會詳細介紹,
這邊介紹基本概念的時候我沒有寫一些代碼上來,我以爲不必,先對概念有一個基本印象就能夠了,後面再上項目的時候我會用代碼很好去解釋一些東西。