繼承ICommand ,RelayCommand命令


1 public class RelayCommand : ICommand 2 { 3 private readonly Action _execute; 4 private readonly Func<bool> _canExecute; 5 public event EventHandler CanExecuteChanged; 6 public RelayCommand(Action execute) : this(execute, null) 7 { 8 } 9 public RelayCommand(Action execute, Func<bool> canExecute) 10 { 11 if (execute == null) 12 { 13 throw new ArgumentNullException("execute"); 14 } 15 this._execute = execute; 16 this._canExecute = canExecute; 17 } 18 public void RaiseCanExecuteChanged() 19 { 20 EventHandler canExecuteChanged = this.CanExecuteChanged; 21 if (canExecuteChanged != null) 22 { 23 canExecuteChanged.Invoke(this, EventArgs.Empty); 24 } 25 } 26 [DebuggerStepThrough] 27 public bool CanExecute(object parameter) 28 { 29 return this._canExecute == null || this._canExecute.Invoke(); 30 } 31 public void Execute(object parameter) 32 { 33 this._execute.Invoke(); 34 } 35 }
我們改變SaveCommand的CanExecute從false到true,而save命令執行的狀態。CanExecuteChanged事件和客戶端調用CanExecute方法,.在實踐中,這將使一個“保存”按鈕,該按鈕被綁定到SaveCommand改變它的狀態從禁用和重新啟用。


1 public class BlingViewModel 2 { 3 private DelegateCommand<object> _saveCommand; 4 private bool _canSaveExecute = true; 5 public ICommand SaveCommand 6 { 7 get 8 { 9 if (_saveCommand == null) 10 { 11 _saveCommand = new DelegateCommand<object>(executeMethod: _ => Save(), canExecuteMethod: _ => _canSaveExecute); 12 } 13 return _saveCommand; 14 } 15 } 16 private void Save() 17 { 18 _canSaveExecute = false; 19 _saveCommand.RaiseCanExecuteChanged(); 20 Console.WriteLine("Saving..."); 21 _canSaveExecute = true; 22 _saveCommand.RaiseCanExecuteChanged(); 23 } 24 }
.也可以直接調用System.Windows.Input.CommandManager.InvalidateRequerySuggested()讓你的
CanExecute
處理程序重新評估。