2013-01-06 11 views
39

Jestem zdezorientowany wzorem polecenia. Jest tak wiele różnych wyjaśnień na temat poleceń. Myślałem, że poniższy kod był delegatecommand, ale po przeczytaniu o relaycommand, mam wątpliwości.Różnica między Delegatecommand, relaycommand i routedcommand

Jaka jest różnica między poleceniem relaycommand, delegatecommand a routedcommand. Czy można pokazać w przykładach, które mają znaczenie dla mojego opublikowanego kodu?

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

zrobiliście wyszukiwania google .. zajrzeć tutaj przykładach spróbuj kod i stosować go do tego, co masz .. 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/en-us/library/ system.windows.input.routedcommand.aspx – MethodMan

+1

Tak, to nie pomogło tak bardzo – Zaz

+0

Sugerowałbym wykonanie wyszukiwania w Google na wzór polecenia na google następnie – MethodMan

Odpowiedz

43

Twoja klasa FindProductCommand implementuje interfejs ICommand, co oznacza, że ​​może być stosowany jako WPF command. Nie jest to ani DelegateCommand, ani RelayCommand, ani też nie jest to RoutedCommand, które są innymi implementacjami interfejsu ICommand.


FindProductCommand vs DelegateCommand/RelayCommand

Generalnie, gdy implementacja ICommand nazwie DelegateCommand lub RelayCommand, intencją jest to, że nie trzeba napisać klasy, która implementuje interfejs ICommand; raczej przekazujesz niezbędne metody jako parametry do konstruktora DelegateCommand/RelayCommand.

Na przykład, zamiast całej klasie, można napisać:

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

Niektóre implementacje DelegateCommand/RelayCommand:

Related:


FindProductCommand vs RoutedCommand

Twój FindProductCommand wykona FindProduct po uruchomieniu.

WPF wbudowany RoutedCommand robi coś innego: podnosi routed event, który może być obsługiwany przez inne obiekty w drzewie wizualnym. Oznacza to, że możesz dołączyć powiązanie polecenia z tymi innymi obiektami, aby wykonać FindProduct, podczas gdy samo podłączenie RoutedCommand do jednego lub więcej obiektów, które wyzwalają polecenie, np. przycisk, element menu lub element menu kontekstowego.

Niektóre związane SO odpowiedzi: