Skip to content

Instantly share code, notes, and snippets.

@schuster-rainer
Created May 9, 2012 21:17
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save schuster-rainer/2648922 to your computer and use it in GitHub Desktop.
Save schuster-rainer/2648922 to your computer and use it in GitHub Desktop.
Implementation from Josh Smith of the RelayCommand
//http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030
public class RelayCommand : ICommand
{
#region Fields
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
#endregion // Fields
#region Constructors
public RelayCommand(Action<object> execute)
: this(execute, null)
{
}
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructors
#region ICommand Members
[DebuggerStepThrough]
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);
}
#endregion // ICommand Members
}
RelayCommand _saveCommand;
public ICommand SaveCommand
{
get
{
if (_saveCommand == null)
{
_saveCommand = new RelayCommand(param => this.Save(),
param => this.CanSave );
}
return _saveCommand;
}
}
@antikmozib
Copy link

You can even have a non-generic class deriving from @AnkitBajpaii generic one:

public class RelayCommand : RelayCommand<object>
{
	public RelayCommand(Action execute)
		: this(execute, null) { }

	public RelayCommand(Action execute, Func<bool> canExecute)
		: base(param => execute(), param => canExecute()) { }
}

This throws a NullReferenceException when canExecute is null.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment