系列目錄:
MVVM模式解析和在WPF中的實作(一)MVVM模式簡介
MVVM模式解析和在WPF中的實作(二)資料綁定
MVVM模式解析和在WPF中的實作(三)指令綁定
MVVM模式解析和在WPF中的實作(四)事件綁定
MVVM模式解析和在WPF中的實作(五)View和ViewModel的通信
MVVM模式解析和在WPF中的實作(六)用依賴注入的方式配置ViewModel并注冊消息
這個問題其實是很好了解的,因為事件是豐富多樣的,單純的指令綁定遠不能覆寫所有的事件。例如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中擷取資料,例如從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對象接收事件對象,并顯示出滑鼠相對于窗體的位置以及各個按鍵的狀态。
示例程式運作後如下所示
https://github.com/durow/TestArea/tree/master/MVVMTest/EventBindingTest
更多内容歡迎通路我的部落格:http://www.durow.vip