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

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

事件綁定

系列目錄:html

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

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

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

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

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

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

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方法的影響。htm

 

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

相關文章
相關標籤/搜索