Объект DelegateCommand не может быть преобразован в переменную типа ICommand
Изучаю паттерн MVVM, и столкнулся с проблемой в классе ViewModel. Информацию я беру с этой статьи: https://intellitect.com/blog/getting-started-model-view-viewmodel-mvvm-pattern-using-windows-presentation-framework-wpf/.
В статье класс ViewModel содержит поля типа DelegateCommand и ICommand:
public class ViewModel : ViewModelBase
{
private readonly DelegateCommand _changeNameCommand;
public ICommand ChangeNameCommand => _changeNameCommand;
public ViewModel()
{
_changeNameCommand = new DelegateCommand(OnChangeName, CanChangeName);
}
...
}
Но у меня возникает ошибка с преобразованием _changeNameCommand в переменную ChangeNameCommand. Пишет:
Не удается неявно преобразовать тип "MVVM.ViewModel.DelegateCommand" в "System.Windows.Input.ICommand". Существует явное преобразование(возможно, пропущено приведение типов)
Хорошо, делаю явное приведение:
public ICommand ChangeNameCommand => (ICommand)_changeNameCommand;
Но после этого среда начинает ругаться на вот эту строку в конструкторе:
_changeNameCommand = new DelegateCommand(OnChangeName, CanChangeName);
Пишет, что:
DelegateCommand не содержит конструктор, который принимает аргументы 2.
Хотя конструктор с двумя параметрами для DelegateCommand определен. Более того, вопросы возникают еще на стадии, когда среда начинает требовать явное приведение DelegateCommand к ICommand. Ведь DeelegateCommand реализует этот интерфейс.
Вот мой код DelegateCommand:
public class DelagateCommand : ICommand
{
private readonly Action<object> _executeAction;
private readonly Predicate<object> _canExecuteAction;
public DelagateCommand(Action<object> executeAction) : this(executeAction, null)
{
_executeAction = executeAction;
}
public DelagateCommand(Action<object> executeAction, Predicate<object> CanExecuteAction)
{
_executeAction = executeAction;
_canExecuteAction = CanExecuteAction;
}
public void InvokeCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
public void Execute(object parametr) { _executeAction(parametr); }
public bool CanExecute(object parametr) => _canExecuteAction?.Invoke(parametr) ?? true; //все, что является делегатом можно запустить. Тут мы запускаем проверку на возможность выполнения команды
public event EventHandler CanExecuteChanged;
}
Все классы описаны буквально так же, как в статье.