WPF中的命令(Command)

這節來講一下WPF中的命令(Command)的使用。

【認識Command】

我們之前說過,WPF本身就為我們提供了一個基礎的MVVM框架,本節要講的命令就是其中一環,透過在ViewModel中宣告命令,從View中使用Binding繫結命令,就能實現從View到ViewModel之間操作的流通。

ICommand 介面:

所有的命令都是需要繼承

ICommand

介面,該介面有如下三個成員:

我們先說第二個成員,它是個返回值為bool的方法,透過這個方法,可以設定命令能不能繼續執行,即返回值為TRUE,命令繼續執行,返回值為FALSE命令不會執行;

第一個成員是個事件處理器,從名字可以看出來該事件處理器關注於第二個成員,也就是當命令能否執行的狀態出現改變時可以使用此事件通知到關注此命令執行狀態的成員;

第三個成員也是個方法,命令的執行邏輯放在這個方法裡邊,當CanExecute返回值為TRUE時,該方法才會被執行。

【自定義Command】

下面我們就來自定義一個命令,這樣能比較方便的演示命令的使用:

本節以MVVM模式演示,專案結構如下:

WPF中的命令(Command)

MyCommand為自定義的命令類,程式碼如下:

WPF中的命令(Command)

MyCommand類在例項化時需要外部傳入執行的方法以及能否繼續執行的判斷方法。

MainViewModel中的程式碼如下:

WPF中的命令(Command)

在ViewModel中宣告命令要注意,命令必須是屬性,不能是欄位。

View程式碼如下:

WPF中的命令(Command)

在Button有個Command屬性,我們可以直接使用Binding和ViewModel中的命令物件做繫結。

此處要注意MainView的構造方法中這一行程式碼:

DataContext屬性要設定為ViewModel例項,這樣View才能跟ViewModel關聯上,從而使用Binding才能繫結上MyCommand命令。

另外需要知道的是,Button中的Command是透過點選觸發的,也就是說當你點選的Button命令就會執行,其它的控制元件,如ListBox中的Item,需要雙擊才能執行命令,因為單擊是選中Item。

當程式執行時,點選按鈕,輸出視窗會列印“命令被執行了”字樣:

WPF中的命令(Command)

然後我們清除掉輸出視窗的內容,當再一次點選按鈕時,因為isCanExec被設定為FALSE,所以命令終止執行,輸出視窗無內容:

【命令引數CommandParameter】

如果命令僅僅是這樣使用,那就太單調了,大家肯定注意到了Execute和CanExecute方法還有個型別為object的引數,這個引數就是命令引數,它可以接收我們自定義的資料,在執行命令時傳入進來,我們則可以根據這個引數,對執行邏輯做多樣化的判斷,下面我將程式碼稍作改變:

在介面上放置兩個按鈕,並修改ViewModel程式碼為如下所示:

在Button中使用CommandParameter屬性設定命令的引數,預設會將資料當做string處理,當然它也可以使用Binding跟其它屬性做繫結,關於View與ViewModel之間的資料繫結,我們後期講解。

WPF中的命令(Command)

在MyCommand的執行邏輯中判斷引數的值,從而輸出不同的結果,一次點選按鈕結果如下:

WPF中的命令(Command)

——————————————————-

需要進技術群交流的,請新增小編mm1552923