1. 程式人生 > >MVVM設計模式的事件綁定

MVVM設計模式的事件綁定

src action 技術分享 顯示 depend tar exec img left

為什麽要事件綁定

這個問題其實是很好理解的,因為事件是豐富多樣的,單純的命令綁定遠不能覆蓋所有的事件。例如Button的命令綁定能夠解決Click事件的需求,但Button的MouseEnter、窗體的Loaded等大量的事件要怎麽處理呢?這就用到了事件綁定。

事件綁定

要使用事件綁定需要借助System.Windows. interactivity,如果安裝了Blend,裏面就包含了這個dll。需要在Interaction.Triggers裏面添加一個或多個EventTrigger並指定關註的的事件名稱,在EventTrigger中通過InvokeCommandAction來綁定事件對應的命令。圖中所示綁定了主窗口的Loaded事件,在事件觸發後會調用綁定的命令對象LoadedCommand的Execute方法執行命令,當命令綁定需要參數時可以通過綁定CommandParameter實現。需要指出的是之前在實現MyCommand的Execute方法時我們加入了CanExecute的判斷,因此事件觸發後是否能夠真正執行綁定的命令也受到綁定的LoadedCommand的CanExecute方法的影響。

技術分享圖片

帶EventArgs參數的事件綁定

上面介紹的事件綁定並不足以應對所有的情況,因為很多情況下我們還需要從事件的EventArgs中獲取數據,例如從MouseMove事件參數中獲取鼠標位置和按鍵狀態等。但InvokeCommandAction在未對CommandParameter綁定的情況下給Execute方法傳遞的參數為null。因此我們需要自己寫一個類來處理事件到命令的綁定。

技術分享圖片

看一下上面我們用到的InvokeCommandAction,繼承自TriggerAction<DependencyObject>,TriggerAction是一個抽象類,我們只要繼承這個類並實現Invoke方法即可。TriggerAction在MSDN中的介紹如下:

https://msdn.microsoft.com/zh-cn/library/system.windows.interactivity.triggeraction(v=expression.40).aspx

我簡單實現了以下,代碼如下圖所示,其中依賴項屬性是借助propdp代碼段生成的,要不實在記不住,輸入那麽多代碼也好麻煩。使用的時候用來代替之前的InvokeCommandAction,不綁定CommandParameter則傳遞的就是事件的參數。如果綁定了CommandParameter,那麽傳遞的就是綁定的參數。

技術分享圖片

事件綁定的示例

有了MyEventCommand我們就可以綁定事件並獲取事件參數了。實例中綁定了窗體的Loaded事件和MouseMove事件,其中在MouseMove事件中我們使用自己的MyEventCommand對象接收事件對象,並顯示出鼠標相對於窗體的位置以及各個按鍵的狀態。

技術分享圖片

示例程序運行後如下所示

技術分享圖片

MVVM設計模式的事件綁定