Ответ 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
:
- Ссылка Microsoft Prism DelegateCommand
- Реализация WPF Tutorial
ICommand
называетсяDelegateCommand
- Другая реализация также называется
DelegateCommand
- оригинальная реализация
RelayCommand
от Josh Smith
по теме:
FindProductCommand
vs RoutedCommand
Ваш FindProductCommand
выполнит FindProduct
при запуске.
WPF встроенный RoutedCommand
делает что-то еще: он вызывает маршрутизируемое событие, которое может обрабатываться другими объектами в визуальном дереве. Это означает, что вы можете присоединить привязку команды к этим другим объектам для выполнения FindProduct
, при этом сама привязана RoutedCommand
к одному или нескольким объектам, которые запускают команду, например. кнопку, пункт меню или пункт контекстного меню.
Некоторые связанные ответы SO: