what is the difference between these two relaycommand:
public class RelayCommand : ICommand { #region fields private Action methodToExecute; private Func<bool> canExecuteEvaluator; #endregion #region constructor public RelayCommand(Action methodToExecute) : this(methodToExecute, null) { } public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator) { this.methodToExecute = methodToExecute; this.canExecuteEvaluator = canExecuteEvaluator; } #endregion #region ICommand members public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public bool CanExecute(object parameter) { if (this.canExecuteEvaluator == null) { return true; } else { bool result = this.canExecuteEvaluator.Invoke(); return result; } } public void Execute(object parameter) { this.methodToExecute.Invoke(); } #endregion }
and
public class RelayCommand<T> : ICommand { #region Fields private readonly Action<T> _execute = null; private readonly Predicate<T> _canExecute = null; #endregion #region Constructors /// <summary> /// Creates a new command that can always execute. /// </summary> /// <param name="execute">The execution logic.</param> public RelayCommand(Action<T> execute) : this(execute, null) { } /// <summary> /// Creates a new command with conditional execution. /// </summary> /// <param name="execute">The execution logic.</param> /// <param name="canExecute">The execution status logic.</param> public RelayCommand(Action<T> execute, Predicate<T> canExecute) { if (execute == null) throw new ArgumentNullException("execute"); _execute = execute; _canExecute = canExecute; } #endregion #region ICommand Members // // Summary: // Defines the method that determines whether the command can execute in its current // state. // // Parameters: // parameter: // Data used by the command. If the command does not require data to be passed, // this object can be set to null. // // Returns: // true if this command can be executed; otherwise, false. public bool CanExecute(object parameter) { return _canExecute == null ? true : _canExecute((T)parameter); } // // Summary: // Occurs when changes occur that affect whether or not the command should execute. public event EventHandler CanExecuteChanged { add { if (_canExecute != null) CommandManager.RequerySuggested += value; } remove { if (_canExecute != null) CommandManager.RequerySuggested -= value; } } // // Summary: // Defines the method to be called when the command is invoked. // // Parameters: // parameter: // Data used by the command. If the command does not require data to be passed, // this object can be set to null. public void Execute(object parameter) { _execute((T)parameter); } #endregion }
and can i dispense with the first one.