using System; using System.Windows.Input; namespace FSI.Lib.MVVM { public class RelayCommand : ICommand { #region Fields readonly Action _execute = null; readonly Predicate _canExecute = null; #endregion #region Constructors /// /// Initializes a new instance of . /// /// Delegate to execute when Execute is called on the command. This can be null to just hook up a CanExecute delegate. /// will always return true. public RelayCommand(Action execute) : this(execute, null) { } /// /// Creates a new command. /// /// The execution logic. /// The execution status logic. public RelayCommand(Action execute, Predicate canExecute) { if (execute == null) throw new ArgumentNullException("execute"); _execute = execute; _canExecute = canExecute; } #endregion #region ICommand Members /// ///Defines the method that determines whether the command can execute in its current state. /// ///Data used by the command. If the command does not require data to be passed, this object can be set to null. /// ///true if this command can be executed; otherwise, false. /// public bool CanExecute(object parameter) { return _canExecute == null ? true : _canExecute((T)parameter); } /// ///Occurs when changes occur that affect whether or not the command should execute. /// public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } /// ///Defines the method to be called when the command is invoked. /// ///Data used by the command. If the command does not require data to be passed, this object can be set to . public void Execute(object parameter) { _execute((T)parameter); } #endregion } }