RelayCommand - это не RoutedCommand, и я думаю, это то, что вы запутались.
Конструкторы для команды Relay принимают делегат действия и необязательный делегат предиката . Эти делегаты не принимают EventArgs, а только один параметр Object, поэтому вы сталкиваетесь с ошибкой. Предикат также требует тип возврата bool, который является следующей ошибкой, которую вы получите. В предикате CanExecute вместо установки e.CanExecute, как вы делаете с RoutedCommand, вы просто возвращаете true / false.
Вот как это должно выглядеть:
public ICommand RelayCommand_MoveUp
{
get
{
if (_relayCommand_MoveUp == null)
{
_relayCommand_MoveUp = new RelayCommand(Execute_MoveUp, CanExecute_MoveUp);
}
return _relayCommand_MoveUp;
}
}
private void Execute_MoveUp(object sender)
{
if (_selectedFolder != null)
{
_selectedFolder.SelectParent();
}
}
private void CanExecute_MoveUp(object sender)
{
return (_selectedFolder != null) && (_selectedFolder.Parent != null);
}
РЕДАКТИРОВАТЬ (Добавлено из обсуждения в комментариях):
Если вы хотите использовать что-то более похожее на RoutedCommands, что сделает ViewModel более зависимыми от конкретных представлений WPF, есть несколько хороших доступных вариантов.
В этом обсуждении началась вся идея использования RoutedCommands в сочетании с MVVM.
И вот очень солидное решение проблем, представленных Джошем Смитом и Биллом Кемпфом.