public bool CanExecute(object parameter) => _canExecute == null || _canExecute();
public void Execute(object parameter) => _execute();
public event EventHandler CanExecuteChanged
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
我們在Constructor將要執行的方法
_execute
與判斷是否可執行的方法
_canExecute
當作參數傳入並存至欄位。當Execute()或CanExecute()被呼叫時,便呼叫存好的
_execute
與
_canExecute
。這就類似函數式編程(Functional Programming) 的概念,把方法作為變量使用。透過RelayCommand,我們就可以傳入任何想要執行的方法,把方法封裝成命令了。
注意到這裡我們為ICommand.CanExecuteChanged事件新增了adder與remover,目的是要讓新方法被註冊到事件上時,就自動把方法也註冊給CommandManager.RequerySuggested事件。這個事件是WPF系統處理使用者操作的事件,每當使用者按下按鍵、操作滑鼠時就會呼叫。因此,我們這樣設計CanExecuteChanged的目的就是要讓使用者每次有動作時,就觸發所有註冊到CanExecuteChanged的方法。畢竟,我們不知道使用者做了怎樣的操作會導致命令可行性改變,因此這樣可以確保永遠不會錯過可行性改變的狀況。然而,這樣設計的缺點就是會有效能浪費。所以這部分要怎麼設計,最終還是要看需求而定。
以
[WPF] MVVM – ViewModel
中的範例來說,我們可以使用RelayCommand,就可以把ChangeMessage命令改成:
// MainWindowViewModel.cs
using System.Windows.Input;
namespace WpfMVVM
public class MainWindowViewModel : ViewModelBase
public MainWindowViewModel()
//ChangeMessage = new ChangeMessageCommand(this);
ChangeMessage = new RelayCommand(() => Message = "!!!");
public string Name { get; set; } = "c.y.c";
public string Message { get; set; } = "hello world!";
public ICommand ChangeMessage { set; get; }
執行的效果與原先相同,而日後想要讓其他方法被綁定,同樣透過RelayCommand傳入方法即可。
透過本文,我們了解到RelayCommand的設計概念,可以簡化WPF中方法的綁定,以利減少開發程式的時間。然而,方法的綁定仍未完善,後續我們會介紹Expression blend interactivity,來幫助我們綁定任意的控制項事件。
近期迴響