2012-07-01 6 views
6

uczę MVVM dla C# rozwoju Silverlight zRelayCommand w C#

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

i jestem mylić o klasie RelayCommand wymienionego w kontekście. Kod jest:

public class RelayCommand : ICommand 
{ 
#region Fields 

readonly Action<object> _execute; 
readonly Predicate<object> _canExecute;   

#endregion // Fields 

#region Constructors 

public RelayCommand(Action<object> execute) 
: this(execute, null) 
{ 
} 

public RelayCommand(Action<object> execute, Predicate<object> canExecute) 
{ 
    if (execute == null) 
     throw new ArgumentNullException("execute"); 

    _execute = execute; 
    _canExecute = canExecute;   
} 
#endregion // Constructors 

#region ICommand Members 

[DebuggerStepThrough] 
public bool CanExecute(object parameter) 
{ 
    return _canExecute == null ? true : _canExecute(parameter); 
} 

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

public void Execute(object parameter) 
{ 
    _execute(parameter); 
} 

#endregion // ICommand Members 
} 

Dla których dont naprawdę zrozumieć, jak _execute i _canExecute prac w tej sprawie. (Jestem nowym do C# i nawet nie wiem, co Action i orzecznik. Wiem, że są delegaci ale Jaka jest różnica między nimi i jak one działa?)
A także, w programie, nie zrobił dostać linię

add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 

Czy ktoś może mi wyjaśnić na ten temat, dziękuję!

Odpowiedz

2

RelayCommand wymaga dwie informacje:

  1. Jaki kod należy uruchomić, gdy polecenie jest wykonywane (akcją _execute)
  2. Jaki kod powinien działać w celu ustalenia, czy ta komenda może zostać wykonana (_canExecute predicate)

Numer Action reprezentuje metodę, która zwraca void. W tym przypadku akcja _execute przyjmuje jeden parametr (object) i zwraca void.

A Predicate jest delegatem, który przyjmuje wartość i zwraca wynik logiczny. W tym przypadku predykat _canExecute ma wartość object i zwraca wartość bool.

Obie wartości _execute i _canExecute są dostarczane do RelayCommand gdy jest wykonana, ponieważ są to elementy polecenia, które są unikatowe dla każdego pojedynczego polecenia.

chodzi przypadku CanExecuteChanged:

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

Gdy abonent podpisuje się imprezy, add nazywa i kiedy wypisać, remove nazywa. Powyższe zdarzenie CanExecuteChanged jest tylko zdarzeniem przechodzącym (tj. Jeśli subskrybent subskrybuje zdarzenie CanExecuteChanged, automatycznie subskrybuje zdarzenie CommandManager.RequerySuggested). Według MSDN, imprezy CommandManager.RequerySuggested ...

występuje, gdy poleceń CommandManager wykryje warunki, które mogłyby zmienić zdolność polecenia do wykonania.

wierzę, że abonent najprawdopodobniej wywołać metodę CanExecute na RelayCommand kiedy to zdarzenie jest opalane celu ustalenia, czy polecenie może być nadal wykonywane.

1

Dodawanie/usuwanie są podobne do właściwości get/set, ale zamiast zdarzeń.Kod dodawania zostanie wywołany po wykonaniu polecenia. Kod usuwania jest wywoływany, gdy wykonywana jest funkcja - =. Nie widzisz tej składni bardzo, ponieważ rzadko musisz przesłonić domyślne zachowanie dodawania/usuwania delegata z listy połączeń zdarzeń.

W tym przypadku RelayCommand po prostu odwzorowuje swoje zdarzenie CanExecuteChanged na zdarzenie CommandManager.RequerySuggested.