public class DelegateCommand : ICommand { private readonly Action _action; private readonly Func _canExecute; public event EventHandler CanExecuteChanged { add => CommandManager.RequerySuggested += value; remove => CommandManager.RequerySuggested -= value; } public DelegateCommand(Action action) { _action = action ?? throw new ArgumentNullException(nameof(action)); } public DelegateCommand(Action action, Func canExecuteEvaluator) : this(action) { _canExecute = canExecuteEvaluator ?? throw new ArgumentNullException(nameof(canExecuteEvaluator)); } public bool CanExecute(object parameter) { return _canExecute?.Invoke() ?? true; } public void Execute(object parameter) { _action(); } } public class DelegateCommand : ICommand { private readonly Action _action; private readonly Predicate _canExecute; public DelegateCommand(Action action, Predicate canExecute = null) { _action = action ?? throw new ArgumentNullException(nameof(action)); _canExecute = canExecute; } public bool CanExecute(object parameter) { return _canExecute == null || _canExecute((T)parameter); } public event EventHandler CanExecuteChanged { add => CommandManager.RequerySuggested += value; remove => CommandManager.RequerySuggested -= value; } public void Execute(object parameter) { _action((T)parameter); } }