Конечно. Я собирался указать вам на реализацию Prism, но вкладка исходного кода CodePlex, похоже, не работает. Это будет выглядеть примерно так:
public class SimpleCommand<T> : ICommand
{
public Predicate<T> CanExecuteDelegate { get; set; }
public Action<T> ExecuteDelegate { get; set; }
#region ICommand Members
public bool CanExecute(object parameter)
{
if (CanExecuteDelegate != null)
return CanExecuteDelegate((T)parameter);
return true;// if there is no can execute default to true
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
if (ExecuteDelegate != null)
ExecuteDelegate((T)parameter);
}
#endregion
}
Кстати, ваше использование SimpleCommand в вашем вопросе немного окольно. Вместо этого:
DoSomethingCommand = new SimpleCommand
{
ExecuteDelegate = x => RunCommand(x)
};
Вы могли бы просто иметь:
DoSomethingCommand = new SimpleCommand
{
ExecuteDelegate = this.RunCommand
};
Задание лямбды действительно полезно только в том случае, если вы выполняете встроенную работу следующим образом:
DoSomethingCommand = new SimpleCommand
{
ExecuteDelegate = o => this.SelectedItem = o,
CanExecuteDelegate = o => o != null
};