Je suis confus au sujet du modèle de commande. Il y a tellement d'explications différentes sur les commandes. Je pensais que le code ci-dessous était délégatecommand, mais après avoir lu sur la commande relay, je suis dans le doute.
Quelle est la différence entre relaycommand, delegatecommand et routedcommand. Est-il possible d'afficher des exemples pertinents pour mon code publié?
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; }
}
}
Votre classe FindProductCommand
implémente l'interface ICommand
, ce qui signifie qu'elle peut être utilisée comme une commande WPF . Ce n'est ni un DelegateCommand
ni un RelayCommand
, ni un RoutedCommand
, qui sont d'autres implémentations de l'interface ICommand
.
FindProductCommand
vs DelegateCommand
/RelayCommand
Généralement, lorsqu'une implémentation de ICommand
est nommée DelegateCommand
ou RelayCommand
, l'intention est que vous n'ayez pas à écrire une classe qui implémente le ICommand
interface; vous passez plutôt les méthodes nécessaires en tant que paramètres au constructeur DelegateCommand
/RelayCommand
.
Par exemple, au lieu de toute votre classe, vous pouvez écrire:
ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
(parameter) => _avm.FindProduct(),
(parameter) => _avm.CanFindProduct()
);
Quelques implémentations de DelegateCommand
/RelayCommand
:
ICommand
appelée DelegateCommand
DelegateCommand
RelayCommand
par Josh SmithEn relation:
FindProductCommand
vs RoutedCommand
Votre FindProductCommand
exécutera FindProduct
lorsqu'il sera déclenché.
La fonction intégrée de WPF RoutedCommand
fait autre chose: elle déclenche un événement routé qui peut être géré par d'autres objets dans l'arborescence visuelle. Cela signifie que vous pouvez attacher une liaison de commande à ces autres objets pour exécuter FindProduct
, tout en attachant le RoutedCommand
lui-même spécifiquement à un ou plusieurs objets qui déclenchent la commande, par exemple un bouton, un élément de menu ou un élément de menu contextuel.
Quelques réponses SO réponses: