Подтвердить что ты не робот

Разница между командой делегирования, релейной командой и маршрутизируемой командой

Я запутался в шаблоне команд. Есть много разных объяснений команд. Я думал, что код ниже был командой делегата, но после прочтения команды relaycommand я сомневаюсь.

В чем разница между командой relaycommand, командой delegate и маршрутизируемой командой. Можно ли показать в примерах, имеющих отношение к моему опубликованному коду?

class FindProductCommand : ICommand
{
    ProductViewModel _avm;

    public FindProductCommand(ProductViewModel avm)
    {
        _avm = avm;
    }

    public bool CanExecute(object parameter)
    {
        return _avm.CanFindProduct();
    }

    public void Execute(object parameter)
    {
        _avm.FindProduct();
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

}
4b9b3361

Ответ 1

Ваш класс FindProductCommand реализует интерфейс ICommand, что означает, что он может использоваться как WPF команда. Он не является ни DelegateCommand, ни RelayCommand, ни является RoutedCommand, которые являются другими реализациями интерфейса ICommand.


FindProductCommand vs DelegateCommand/RelayCommand

Как правило, когда реализация ICommand имеет имя DelegateCommand или RelayCommand, предполагается, что вам не нужно писать класс, реализующий интерфейс ICommand; скорее, вы передаете необходимые методы в качестве параметров конструктору DelegateCommand/RelayCommand.

Например, вместо всего вашего класса вы можете написать:

ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
    (parameter) => _avm.FindProduct(),
    (parameter) => _avm.CanFindProduct()
);

Некоторые реализации DelegateCommand/RelayCommand:

по теме:


FindProductCommand vs RoutedCommand

Ваш FindProductCommand выполнит FindProduct при запуске.

WPF встроенный RoutedCommand делает что-то еще: он вызывает маршрутизируемое событие, которое может обрабатываться другими объектами в визуальном дереве. Это означает, что вы можете присоединить привязку команды к этим другим объектам для выполнения FindProduct, при этом сама привязана RoutedCommand к одному или нескольким объектам, которые запускают команду, например. кнопку, пункт меню или пункт контекстного меню.

Некоторые связанные ответы SO: