2012-07-01 9 views
6

Sto imparando MVVM per C# sviluppo di Silverlight daRelayCommand in C#

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

e io sono confuso circa la classe RelayCommand menzionato nel contesto. Il codice è:

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 
} 

Per cui io non capisco come _execute e _canExecute opere in questo caso. (Sono nuovo di C# e anche se non sicuro di quello che è azione e predicato. So che sono delegati, ma che cosa è la differenza tra loro e come funzioni?)
E inoltre, nel programma, mi hanno dato la linea

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

Qualcuno può darmi una spiegazione a riguardo, grazie!

risposta

2

Un RelayCommand richiede due informazioni:

  1. Quale codice dovrebbe essere eseguito quando viene eseguito il comando (la _execute azione)
  2. Quale codice dovrebbe eseguire per determinare se questo comando può essere eseguito (il _canExecute predicato)

Un Action è un delegato che rappresenta un metodo che restituisce void. In questo caso l'azione _execute accetta un parametro (uno object) e restituisce void.

A Predicate è un delegato che prende un valore e restituisce un risultato booleano. In questo caso il predicato _canExecute assume un valore object e restituisce un valore bool.

Sia i _execute e _canExecute valori sono forniti al RelayCommand quando viene costruito perché queste sono le parti del comando che sono unici per ogni singolo comando.

Per quanto riguarda l'evento CanExecuteChanged:

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

Quando un utente si iscrive alla manifestazione, add si chiama e quando si annullare l'iscrizione, remove si chiama. L'evento CanExecuteChanged precedente è solo un evento pass-through (vale a dire se un sottoscrittore si iscrive all'evento CanExecuteChanged, si abbona automaticamente all'evento CommandManager.RequerySuggested). Secondo MSDN, l'evento CommandManager.RequerySuggested ...

si verifica quando il CommandManager rileva le condizioni che potrebbero cambiare la capacità di un comando da eseguire.

credo che un abbonato molto probabilmente chiamare il metodo CanExecute sul RelayCommand quando questo evento viene generato per determinare se il comando può ancora essere eseguito.

1

L'aggiunta/rimozione sono come una proprietà get/set ma per gli eventi.Il codice di aggiunta verrà chiamato quando

RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler 

viene eseguito. Il codice di rimozione è chiamato quando - = viene eseguito. Questa sintassi non viene visualizzata molto, poiché raramente è necessario sovrascrivere il comportamento predefinito di aggiunta/rimozione del delegato dall'elenco delle chiamate degli eventi.

In questo caso, RelayCommand sta mappando il proprio evento CanExecuteChanged sull'evento CommandManager.RequerySuggested.