MVVM設計模式和WPF中的實現(四)事件綁定


MVVM設計模式和在WPF中的實現(四)

事件綁定

系列目錄:

MVVM模式解析和在WPF中的實現(一)MVVM模式簡介

MVVM模式解析和在WPF中的實現(二)數據綁定

MVVM模式解析和在WPF中的實現(三)命令綁定

MVVM模式解析和在WPF中的實現(四)事件綁定

MVVM模式解析和在WPF中的實現(五)View和ViewModel的通信 

MVVM模式解析和在WPF中的實現(六)用依賴注入的方式配置ViewModel並注冊消息

0x00 為什么要事件綁定

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

0x01 事件綁定

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

 

0x02 帶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,那么傳遞的就是綁定的參數。

0x03 事件綁定的示例

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

 示例程序運行后如下所示

0x04 相關下載

https://github.com/durow/TestArea/tree/master/MVVMTest/EventBindingTest

 


更多內容歡迎訪問我的博客:http://www.durow.vip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM