UWP中新加的資料繫結方式x:Bind分析總結

durow發表於2015-10-19

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框架,簡直圖樣。相信隨著後面的學習還會不斷產生這種感覺;)

最後要說的就是學東西要踏實,不能一味求快,看過的概念再看一遍,溫故知新也是好的,何況裡面還有新東西。

 


更多內容歡迎訪問我的部落格:http://www.durow.vip

相關文章