UWP中新加的數據綁定方式x:Bind分析總結
0x00 UWP中的x:Bind
由之前有過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也算有所了解了,下面寫一下自己的心得體會。
0x01 為什么要搞出個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也是可以正常使用的。
0x02 x:Bind的使用方法
1.綁定屬性
首先說明一下測試用的Model:
X:Bind和Binding在綁定屬性上的區別就是x:Bind在綁定時需要加上ViewModel實例的名稱,例如后台代碼中創建實例VM
在View中就需要這樣綁定:
需要注意的是x:Bind默認的綁定方式是OneTime,即只綁定一次,在使用時記得根據需求改成OneWay或TwoWay。
此外還需要說明的是,x:Bind的綁定是強類型的,如果遇到綁定源為Object(例如綁定ListView的SelectedItem)需要進行強制類型轉換。如下圖所示,其中local為TestData所在命名空間。
2.綁定命令和事件
綁定命令和屬性綁定類似,需要寫明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中可以把事件綁定到這兩個方法上:
運行起來就像這樣:
0x03 Binding的優勢
x:Bind提供了一種效率優先的綁定方式,但在有些情況下還是需要用Binding來處理的。除了動態綁定外,目前我能想到的就是Binding的UpdateSourceTrigger,可以指定更新數據源的方式。例如在TextBox的Text發生改變時馬上更新數據源,這個x:Bind應該是做不到的吧。還有就是在設計時把DataContext寫在XAML里,使用Binding可以在設計時看到數據。隨着使用增多,應該還會發現更多的需要使用Binding的情況吧。
0x04 寫在最后
x:Bind基本解決了數據/命令/事件綁定的常用場景,對於由此而導致的View和ViewModel的相對緊一點的耦合,我個人是完全可以接受的。因此我個人的原則就是能使用x:Bind的情況下優先使用x:Bind,x:Bind滿足不了需求了再使用Binding。
然后再回過頭來看看之前寫的UWP下的MVVM框架,簡直圖樣。相信隨着后面的學習還會不斷產生這種感覺;)
最后要說的就是學東西要踏實,不能一味求快,看過的概念再看一遍,溫故知新也是好的,何況里面還有新東西。