Объект 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;

}

Все классы описаны буквально так же, как в статье.


Ответы (0 шт):