衆所周知,在UWP中,微軟爲咱們提供了一種新的綁定方式:x:bind,它是基於編譯時的綁定。在性能方面,運行時綁定Binding與它相比仍是有些遜色的。所以針對一些肯定的、不須要變動的數據,咱們徹底有理由來使用X:bind進行綁定。(固然,若是你不在意程序性能的話就不必繼續往下看了!)html
悉MVVM的朋友都知道,咱們經常遇到這樣一種狀況:咱們須要爲一個控件綁定一個ViewModel中的Command,可是這個控件並無Command屬性?籠統的解決方法有不少,我這裏大體列舉幾種經常使用的解決方法:設計模式
一、EventToCommand(較常規)app
經過事件觸發器來進行關聯,這種解決方法是最常規的也是最廣泛的。經過Blend,咱們能夠發現微軟爲咱們提供了10種不一樣的行爲來知足咱們的開發需求。至於具體如何使用這裏就再也不詳述,感興趣的朋友能夠看一下我以前寫的一篇文章:在UWP中實現本身的MVVM設計模式。 那裏面有相關介紹,此處僅截圖顯示這10種行爲。函數
二、消息機制(較靈活):性能
若是你已經在你的項目中使用了MVVMLight的話,你就會多一種選擇,那就是他已經爲你封裝的一套消息機制(固然,你徹底也能夠本身去實現)。你能夠經過發送消息和註冊消息來確保控件在合適的事件中去處理ViewModel中合適的事情。這一部分如何使用能夠參考博客園中@樓上那個蜀黍寫的幾篇關於如何使用MVVMLight文章,裏面有相關介紹,挺適合新入門的朋友。這裏僅列出對應的類成員:學習
三、X:Bind(較樸實):this
利用原生的X:bind也能夠將事件註冊到對應的ViewModel中。前面咱們已經大體瞭解了使用它的好處,所以我打算大體演示一下該如何使用它。我這裏演示一下如何將TextBlock的Tapped事件註冊到MainViewModel中:spa
首先咱們須要將事件註冊到ViewModel中,代碼很簡單,和VS爲咱們自定生成的代碼徹底同樣,你徹底能夠將VS爲你自動生成的事件函數剪切到對應的View中。可是有必定是須要注意的,咱們須要將該函數的訪問修飾符設置爲Public,不然View是沒法訪問的。示例代碼如所示:設計
其次,咱們須要將TextBlock的Tapped事件與ViewModel中註冊的事件關聯起來,咱們試試常規的綁定:3d
<TextBlock Text="Click Me" Tapped="{x:Bind TextBlock_Tapped}" />
或許你寫到這已經開始調試運行了,可是結果可能並無達到你的預期要求,VS會給你報一個這樣的錯誤:無效的綁定路徑「TextBlock_Tapped」: 類型「MainPage」上沒法找到屬性「TextBlock_Tapped」。
遇到錯誤不要慌,我相信你可以看懂這就錯誤提示給你的解決方案。對,你須要在對應的MainPage.cs中爲其設置對應的數據上下文,這樣作的目的是告訴編譯器:當你要編譯的時候,你在我指定的數據上下文中綁定對應的函數。所以,咱們在對應的cs中進行相關的數據上下文賦值:
public sealed partial class MainPage : Page { public MainViewModel VM { get; } public MainPage() { this.InitializeComponent(); VM = this.DataContext as MainViewModel; } }
而後在對應的XAML中將綁定進行相應的修改:
<TextBlock Text="Click Me" Tapped="{x:Bind VM.TextBlock_Tapped}"/>
寫到這裏,你已經成功將一個View中的控件的事件在ViewModel中註冊了,這樣你就能夠在ViewModel中處理對應事情。關於X:bind更多的介紹能夠參考博客園中一位博主 @E不當心 博文。
四、自定義Command屬性(有逼格):
經過自定義依賴屬性爲控件添加Command屬性,我不得不說這種實現方式是最有逼格的。說實話,我在寫代碼的時候,不到萬不得已,我是不會使用自定義依賴屬性來解決個人問題的。由於有時候我在寫它的時候會遇到一些莫名其妙的問題,哎,只怪我學藝不精,對這種技術暫時是望成莫及。千萬不要問我怎麼寫,我也不會,渣渣一個,望諸位大神見諒!
五、總結:
在實際開發中,咱們遇到的問題總會層出不窮,上述幾種解決方法並非一本萬利的,它們各有利弊,我以爲授人以魚不如授人以漁,合適的纔是最好的。所以,上述的4種方法在我看來並無什麼可比性,不管是複雜亦或是簡單,只要能隨機應變,具體狀況具體分析就好!