2013-01-06 15 views
39

Ich bin verwirrt über Befehlsmuster. 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.Unterschied zwischen DelegateCommand, relaycommand und RoutedCommand

Was ist der Unterschied zwischen relaycommand, DelegateCommand und RoutedCommand ist. Ist es möglich, in Beispielen zu zeigen, die Relevanz für meinen gebuchten Code haben?

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

} 
+0

haben Sie eine Google-Suche durchgeführt .. bei den hier Beispiele aussehen versuchen, den Code und wenden Sie es auf, was Sie haben .. http://msdn.microsoft.com/en-us/library/ff654132.aspx http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.mvvm.relaycommand.aspx http://msdn.microsoft.com/de-de/library/ system.windows.input.routedcommand.aspx – MethodMan

+1

Ja, es hat nicht so viel geholfen – Zaz

+0

Ich würde vorschlagen, eine Google-Suche auf Befehl Muster auf Google dann – MethodMan

Antwort

43

Ihre FindProductCommand Klasse implementiert die ICommand Schnittstelle, was bedeutet, kann es als WPF command verwendet werden. Es ist weder ein DelegateCommand noch ein RelayCommand, noch ist es ein RoutedCommand, die andere Implementierungen der ICommand Schnittstelle sind.


FindProductCommand vs DelegateCommand/RelayCommand

Im Allgemeinen, wenn eine Implementierung von ICommand gestattet DelegateCommand oder RelayCommand, ist die Absicht, dass Sie nicht eine Klasse schreiben müssen, die die ICommand Schnittstelle implementiert; Stattdessen übergeben Sie die notwendigen Methoden als Parameter an den Konstruktor DelegateCommand/RelayCommand.

Zum Beispiel, statt Ihrer gesamten Klasse, könnten Sie schreiben:

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

Einige Implementierungen von DelegateCommand/RelayCommand:

Verwandte:


FindProductCommand vs RoutedCommand

Ihre FindProductCommand führt FindProduct aus, wenn sie ausgelöst wird.

WPF eingebaut in RoutedCommand tut etwas anderes: es stellt ein routed event, die durch andere Objekte in der visuellen Struktur gehandhabt werden kann. Das bedeutet, ein Befehl-Bindung an diesen anderen Objekten befestigen können FindProduct, auszuführen, während die RoutedCommand Befestigung sich spezifisch an ein oder mehrere Objekte, die den Befehl auslösen, z.B. eine Schaltfläche, ein Menüelement oder ein Kontextmenüelement.

Einige SO Antworten bezogen werden: