Ich bin verwirrt über das Kommandomuster. Es gibt so viele verschiedene Erklärungen zu den Befehlen. Ich dachte, der folgende Code wäre ein Delegate-Befehl, aber nachdem ich über den Relay-Befehl gelesen habe, bin ich im Zweifel.
Was ist der Unterschied zwischen Relay-Befehl, Delegate-Befehl und Routing-Befehl? Ist es möglich, in Beispielen zu zeigen, die für meine Postleitzahl relevant sind?
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; }
}
}
Ihre Klasse FindProductCommand
implementiert die Schnittstelle ICommand
, was bedeutet, dass sie als WPF Befehl verwendet werden kann =. Es ist weder ein DelegateCommand
noch ein RelayCommand
, noch ist es ein RoutedCommand
, die andere Implementierungen der Schnittstelle ICommand
sind.
FindProductCommand
vs DelegateCommand
/RelayCommand
Wenn eine Implementierung von ICommand
den Namen DelegateCommand
oder RelayCommand
hat, müssen Sie im Allgemeinen keine Klasse schreiben, die das ICommand
implementiert. Schnittstelle; Stattdessen übergeben Sie die erforderlichen Methoden als Parameter an den Konstruktor DelegateCommand
/RelayCommand
.
Beispielsweise könnten Sie anstelle Ihrer gesamten Klasse schreiben:
ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
(parameter) => _avm.FindProduct(),
(parameter) => _avm.CanFindProduct()
);
Einige Implementierungen von DelegateCommand
/RelayCommand
:
ICommand
mit dem Namen DelegateCommand
DelegateCommand
genanntRelayCommand
von Josh SmithVerbunden:
FindProductCommand
vs RoutedCommand
Dein FindProductCommand
führt FindProduct
aus, wenn es ausgelöst wird.
Das in WPF integrierte RoutedCommand
bewirkt etwas anderes: Es löst ein Routing-Ereignis aus, das von anderen Objekten in der visuellen Struktur verarbeitet werden kann. Dies bedeutet, dass Sie einen Befehl an diese anderen Objekte anhängen können, um FindProduct
auszuführen, während Sie den RoutedCommand
selbst speziell an ein oder mehrere Objekte anhängen können, die den Befehl auslösen, z. eine Schaltfläche, ein Menüelement oder ein Kontextmenüelement.
Einige verwandte SO Antworten: