webentwicklung-frage-antwort-db.com.de

Unterschied zwischen Delegate-Befehl, Relay-Befehl und Routing-Befehl

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; }
    }

}
46
Zaz

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:

Verbunden:


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:

52
Zev Spitz