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;
}
}
@mcsantiago
Copy link

mcsantiago commented Mar 24, 2018

Just out of curiosity, where does the CommandManager come from?

EDIT:
I found out why I didn't have the CommandManager. You have to make sure you include PresentationCore in your references.

@xtremertx
Copy link

This is cool guys, thanks for sharing.

@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