2012-07-01 15 views
6

estoy aprendiendo MVVM para C# desarrollo de SilverlightRelayCommand en C#

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

y estoy confundido acerca de la clase RelayCommand mencionado en el contexto. El código es:

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 
} 

Por lo que yo realmente no entiendo cómo _execute y _canExecute obras en este caso. (Soy nuevo en C# y aún no está seguro de cuál es la acción y predicado. Sé que son delegados, pero cuál es la diferencia entre ellos y cómo funciona?)
Y también, en el programa, me hizo llegar la línea

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

¿Puede alguien darme una explicación sobre esto, gracias!

Respuesta

2

Un RelayCommand requiere dos tipos de información:

  1. ¿Qué código debe ejecutar cuando se ejecuta el comando (el _execute acción)
  2. ¿Qué código se debe ejecutar para determinar si este comando se puede ejecutar (el _canExecute predicado)

Un Action es un delegado que representa un método que devuelve void. En este caso, la acción _execute toma un parámetro (un object) y devuelve void.

A Predicate es un delegado que toma un valor y devuelve un resultado booleano. En este caso, el predicado _canExecute toma un valor de object y devuelve un bool.

Tanto los _execute y _canExecute valores son suministrados al RelayCommand cuando se construye porque estas son las partes del comando que son únicos para cada comando individual.

con respecto al evento CanExecuteChanged:

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

Cuando un abonado se suscribe al evento, add se llama y cuando darse de baja, remove se llama. El evento CanExecuteChanged anterior es solo un evento de paso (es decir, si un suscriptor se suscribe al evento CanExecuteChanged, se suscribe automáticamente al evento CommandManager.RequerySuggested). De acuerdo con MSDN, el evento CommandManager.RequerySuggested ...

se produce cuando el Administrador de comandos detecta condiciones que podrían cambiar la capacidad de un comando a ejecutar.

creo que un suscriptor lo más probable es llamar al método CanExecute en el RelayCommand cuando este evento se dispara para determinar si el comando todavía puede ser ejecutado.

1

Los add/remove son como una propiedad get/set pero para eventos en su lugar.Se llamaría al código de agregado cuando se ejecuta

RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler 

. El código de eliminación se invoca cuando - = se ejecuta. No se ve mucho esta sintaxis, ya que rara vez se necesita anular el comportamiento predeterminado de agregar/quitar el delegado de la lista de llamadas de eventos.

En este caso, RelayCommand solo está asignando su evento CanExecuteChanged al evento CommandManager.RequerySuggested.