由之前有過WPF開發經驗,是以在學習UWP的時候直接省略了XAML、資料綁定等幾個看着十分眼熟的主題。學習過程中倒是也沒遇到麻煩。直到在園子裡看到了這篇文章:
http://www.cnblogs.com/gaoshang212/p/4534138.html
原來UWP的綁定中新加了個x:Bind,從文章中可以看到x:Bind的效率是很高的。找到MSDN(資料綁定)看了一下(完整的學習目錄可參見: http://www.cnblogs.com/durow/p/4878822.html),然後試着寫了幾個測試程式,對x:Bind也算有所了解了,下面寫一下自己的心得體會。
這個問題還是比較容易回答的,因為x:Bind的效率高。畢竟UWP覆寫了手機端,而手機一方面硬體的性能有限,另一方面電池電量也有限,是以節約性能開銷有着很大的意義。x:Bind為什麼能節約開銷呢,因為x:Bind的資料綁定發生在編譯時,也就是說在編譯的時候View中綁定的什麼資料,資料是什麼類型的就已經清楚了,綁定工作在編譯時即可完成。是以需要我們在背景代碼中指定一個類型明确的ViewModel,這樣在View中使用x:Bind綁定ViewModel中的資料,一切都是類型明确的。而Binding是在程式運作時才能确定資料源的,屬于動态綁定,效率自然不如x:Bind。但從設計上來看,x:Bind使View和ViewModel之間的耦合更緊了,因為必須給View指定一個類型明确的ViewModel。使用x:Bind算是犧牲設計換效率吧,是一種折中的方式。當然如果不喜歡x:Bind也不在乎那點性能,Binding也是可以正常使用的。
首先說明一下測試用的Model:

X:Bind和Binding在綁定屬性上的差別就是x:Bind在綁定時需要加上ViewModel執行個體的名稱,例如背景代碼中建立執行個體VM
在View中就需要這樣綁定:
需要注意的是x:Bind預設的綁定方式是OneTime,即隻綁定一次,在使用時記得根據需求改成OneWay或TwoWay。
此外還需要說明的是,x:Bind的綁定是強類型的,如果遇到綁定源為Object(例如綁定ListView的SelectedItem)需要進行強制類型轉換。如下圖所示,其中local為TestData所在命名空間。
綁定指令和屬性綁定類似,需要寫明ViewModel的執行個體。在ViewModel中有指令CmdTest如下所示:
在View中就可以這樣綁定:
此外很重要的一點就是x:Bind支援綁定事件,看到這個一口老血噴到螢幕上。在WPF中又是引用第三方dll又是寫EventToCommand,就是為了綁定個事件傳遞個事件參數(MVVM設計模式和WPF中的實作(四)事件綁定),如果說剛接觸UWP時看到InvokeCommandAction可以傳遞事件參數還可以用激動來形容的話,看到x:Bind的事件綁定隻能是吐血了。我們可以像以前那樣把事件綁定到指令,綁定方式可以是Binding也可以是x:Bind,除此之外可以直接使用x:Bind把事件綁定到ViewModel的一個方法上,這個方法可以是無參數的也可以是符合EventHandler簽名的。
例如在ViewModel中有兩個方法Loaded和Moved:
在View中可以把事件綁定到這兩個方法上:
運作起來就像這樣:
x:Bind提供了一種效率優先的綁定方式,但在有些情況下還是需要用Binding來處理的。除了動态綁定外,目前我能想到的就是Binding的UpdateSourceTrigger,可以指定更新資料源的方式。例如在TextBox的Text發生改變時馬上更新資料源,這個x:Bind應該是做不到的吧。還有就是在設計時把DataContext寫在XAML裡,使用Binding可以在設計時看到資料。随着使用增多,應該還會發現更多的需要使用Binding的情況吧。
x:Bind基本解決了資料/指令/事件綁定的常用場景,對于由此而導緻的View和ViewModel的相對緊一點的耦合,我個人是完全可以接受的。是以我個人的原則就是能使用x:Bind的情況下優先使用x:Bind,x:Bind滿足不了需求了再使用Binding。
然後再回過頭來看看之前寫的UWP下的MVVM架構,簡直圖樣。相信随着後面的學習還會不斷産生這種感覺;)
最後要說的就是學東西要踏實,不能一味求快,看過的概念再看一遍,溫故知新也是好的,何況裡面還有新東西。
更多内容歡迎通路我的部落格:http://www.durow.vip