MVVM模式解析和在WPF中的實現(三)
命令繫結
系列目錄:
MVVM模式解析和在WPF中的實現(五)View和ViewModel的通訊
MVVM模式解析和在WPF中的實現(六)用依賴注入的方式配置ViewModel並註冊訊息
0x00 命令繫結要達到的效果
命令繫結要關注的核心就是兩個方面的問題,命令能否執行和命令怎麼執行。也就是說當View中的一個Button繫結了ViewModel中一個命令後,什麼時候這個Button是可用的,按下Button後執行什麼操作。解決了這兩個問題基本就實現了命令繫結。另外一個問題就是執行過程中需要的資料(引數)要如何傳遞。本次主要探討這幾個問題。
0x01 命令繫結的實現
自定義一個能夠被繫結的命令需要實現ICommand介面。該介面包含:
public event EventHandler CanExecuteChanged // 在命令可執行狀態發生改變時觸發 public bool CanExecute(object parameter) //檢查命令是否可用的方法 public void Execute(object parameter) //命令執行的方法
那麼要如何實現這個介面呢?那得先搞明白這個介面是幹什麼用的。MSDN上是這麼說的:
https://msdn.microsoft.com/zh-cn/library/system.windows.input.icommand(v=vs.110).aspx
我總結了一下大概是這樣的
CanExecute和Execute方法是介面給出的,我們要做的就是新建一個類MyCommand來實現這兩個方法執行的內容。可以通過在MyCommand的建構函式中傳入Action<object>和Func<object,bool>,讓CanExecute執行Func<object,bool>,Execute執行Action<object>。實現後MyCommand結構如下圖所示,其中淺綠色背景的為ICommand介面的實現,淺藍色背景的為MyCommand的成員。
0x02 新增泛型支援的命令MyCommand<T>
命令繫結時經常需要傳引數,這種情況下可以給MyCommand新增泛型支援
0x03 命令繫結示例
有了MyCommand類,我們就可以在ViewModel中建立一個MyCommand物件,然後在View中繫結了。示例如下:
0x03 相關下載
示例程式碼: https://github.com/durow/TestArea/tree/master/MVVMTest/CommandTest
更多內容歡迎訪問我的部落格:http://www.durow.vip