MVVM設計模式基礎知識--ICommand介面
命令是 Windows Presentation Foundation (WPF) 中的輸入機制,它提供的輸入處理比裝置輸入具有更高的語義級別。
命令有若干用途:
第一個用途是將語義以及呼叫命令的物件與執行命令的邏輯分離開來。這使得多個完全不同的源可以呼叫相同的命令邏輯,並使得可以針對不同的目標對命令邏輯進行自定義。
例如,在許多應用程式中都能找到的編輯操作 “複製”、 “剪下”和 “貼上”都可使用不同的使用者操作進行呼叫(如果這些操作是使用命令實現的)。 應用程式可能允許使用者通過單擊按鈕、選擇選單項或使用組合鍵(例如 Ctrl+X)剪下所選的物件或文字。通過使用命令,您可以將各種型別的使用者操作繫結到同一邏輯。
命令的另一個用途是指示操作是否可用。
仍然以剪下物件或文字作為示例,該操作只有在選擇了某些內容時才有意義。如果使用者嘗試在沒有選擇任何內容的情況下剪下物件或文字,則不會發生任何操作。為了向用戶指明這一點,許多應用程式都會禁用按鈕和選單項,以使使用者瞭解是否能夠執行某項操作。命令可通過實現 CanExecute 方法來指出操作是否可以執行。 按鈕可以訂閱 CanExecuteChanged 事件,並且,如果 CanExecute 返回 false,則可以禁用按鈕,或者,如果 CanExecute 返回 true,則可以啟用按鈕。
ICommand介面
定義一個命令
命名控制元件:System.Windows.Input
程式集:PresentationCore(PresentationCore.dll中)
語法:public interface ICommand
ICommand成員
CanExecute方法:定義用於確定此命令是否可以在其當前狀態下執行的方法。
語法:bool CanExecute(Object parameter)
當引發CanExecuteChanged事件時,命令源呼叫CanExecute方法。
Execute方法:定義在呼叫此命令時呼叫的方法。
語法:void Execute(Object parameter)
CanExcuteChanged事件:當出現影響是否執行該命令的更改時發生。
語法:event EventHandler CanExecuteChanged
通常,當發生該事件時,命令源對該命令呼叫 CanExecute。
實際應用:
在MVVM的ViewModel中,需要繼承ICommand介面,並實現介面中的函式。
public class RelayCommand : ICommand
{
readonly Action _execute;
readonly Predicate _canExecute;
public RelayCommand(Action execute) : this(execute, null)
{
}
public RelayCommand(Action execute, Predicate canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_execute(parameter);
}
}
上訴程式碼中的一些說明:
可以使用 Action委託以引數形式傳遞方法,而不用顯式宣告自定義的委託。
封裝的方法必須與此委託定義的方法簽名相對應。
也就是說,封裝的方法必須具有一個通過值傳遞給它的引數,並且不能返回值。Predicate 委託
表示定義一組條件並確定指定物件是否符合這些條件的方法。add 上下文關鍵字用於定義一個自定義事件訪問器,當客戶端程式碼訂閱您的 事件時將呼叫該訪問器。
如果提供自定義 add 訪問器,還必須提供 remove 訪問器。remove 上下文關鍵字用於定義一個自定義事件訪問器,當客戶端程式碼取消訂閱 事件時將呼叫該訪問器。
如果提供自定義 remove 訪問器,還必須提供 add 訪問器。CommandManager.RequerySuggested 事件
當 CommandManager 檢測可能更改要執行的命令的功能的條件時發生。