這節來講一下WPF中的命令(Command)的使用。
【認識Command】
我們之前說過,WPF本身就為我們提供了一個基礎的MVVM框架,本節要講的命令就是其中一環,通過在ViewModel中聲明命令,從View中使用Binding綁定命令,就能實現從View到ViewModel之間操作的流通。
ICommand 接口:
所有的命令都是需要繼承ICommand接口,該接口有如下三個成員:
我們先說第二個成員,它是個返回值為bool的方法,通過這個方法,可以設置命令能不能繼續執行,即返回值為TRUE,命令繼續執行,返回值為FALSE命令不會執行;
第一個成員是個事件處理器,從名字可以看出來該事件處理器關注於第二個成員,也就是當命令能否執行的狀態出現改變時可以使用此事件通知到關注此命令執行狀態的成員;
第三個成員也是個方法,命令的執行邏輯放在這個方法里邊,當CanExecute返回值為TRUE時,該方法才會被執行。
【自定義Command】
下面我們就來自定義一個命令,這樣能比較方便的演示命令的使用:
本節以MVVM模式演示,項目結構如下:
MyCommand為自定義的命令類,代碼如下:
MyCommand類在實例化時需要外部傳入執行的方法以及能否繼續執行的判斷方法。
MainViewModel中的代碼如下:
在ViewModel中聲明命令要注意,命令必須是屬性,不能是字段。
View代碼如下:
在Button有個Command屬性,我們可以直接使用Binding和ViewModel中的命令對象做綁定。
此處要注意MainView的構造方法中這一行代碼:
DataContext屬性要設置為ViewModel實例,這樣View才能跟ViewModel關聯上,從而使用Binding才能綁定上MyCommand命令。
另外需要知道的是,Button中的Command是通過點擊觸發的,也就是說當你點擊的Button命令就會執行,其它的控件,如ListBox中的Item,需要雙擊才能執行命令,因為單擊是選中Item。
當程序運行時,點擊按鈕,輸出窗口會打印“命令被執行了”字樣:
然后我們清除掉輸出窗口的內容,當再一次點擊按鈕時,因為isCanExec被設置為FALSE,所以命令終止執行,輸出窗口無內容:
【命令參數CommandParameter】
如果命令僅僅是這樣使用,那就太單調了,大家肯定注意到了Execute和CanExecute方法還有個類型為object的參數,這個參數就是命令參數,它可以接收我們自定義的數據,在執行命令時傳入進來,我們則可以根據這個參數,對執行邏輯做多樣化的判斷,下面我將代碼稍作改變:
在界面上放置兩個按鈕,並修改ViewModel代碼為如下所示:
在Button中使用CommandParameter屬性設置命令的參數,默認會將數據當做string處理,當然它也可以使用Binding跟其它屬性做綁定,關於View與ViewModel之間的數據綁定,我們后期講解。
在MyCommand的執行邏輯中判斷參數的值,從而輸出不同的結果,一次點擊按鈕結果如下:
1024,祝大家節日快樂。