wpf icommand relaycommand

wpf - ¿Cuál es la tarea real de CanExecuteChanged y CommandManager.RequerySuggested?



icommand wpf (2)

  1. CanExecuteChanged notifica a los orígenes de comandos (como un Button o elemento de MenuItem ) que están vinculados a ese ICommand que el valor devuelto por CanExecute ha cambiado. A las fuentes de comandos les preocupa esto porque generalmente necesitan actualizar su estado en consecuencia (por ejemplo, un Button se desactivará si CanExecute() devuelve false ).
  2. El evento CommandManager.RequerySuggested se CommandManager.RequerySuggested cada vez que CommandManager cree que algo ha cambiado y que afectará la capacidad de ejecución de los comandos. Esto podría ser un cambio de enfoque, por ejemplo. Resulta que este evento dispara mucho.

Entonces, en esencia, lo que este código hace es asegurar que cada vez que el administrador de comandos considere que la capacidad de ejecución de un comando ha cambiado, el comando elevará CanExecuteChanged incluso si no ha cambiado.

En realidad, no me gusta este enfoque para implementar ICommand.CanExecuteChanged : se siente flojo y no es del todo confiable. Prefiero un enfoque mucho más refinado donde el comando expone un método (por ejemplo, RaiseCanExecuteChanged() ) que puede llamar para elevar CanExecuteChanged , luego lo llama en los momentos apropiados desde su modelo de vista.

Por ejemplo, si tiene un comando que elimina el cliente seleccionado actualmente, tendrá un manejador CanExecute() que devuelve true solo si hay un cliente seleccionado. Por lo tanto, debería llamar a RaiseCanExecuteChanged cada vez que RaiseCanExecuteChanged el cliente seleccionado.

Obtuve el siguiente código del tutorial MVVM de Josh Smith.

¿Alguien puede dar una explicación rápida de lo que este código realmente hace?

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

No puedo entender dos cosas:

  1. ¿Qué hace el evento CanExecuteChanged ?
  2. ¿Qué hace el CommandManager.RequerySuggested ?

El código anterior es de la Clase RelayCommand desde here .


  • RoutedCommands puede notificar automáticamente si su CanExecute ha cambiado, ya que estamos implementando ICommand aquí, que el sistema WPF desconoce, los RequerySuggested evento RequerySuggested de RequerySuggested .
  • Ahora este evento es llamado con bastante frecuencia por el sistema WPF cuando el foco cambia, cualquier control es editado, etc. Por lo tanto, a su vez se CanExecuteChanged . A medida que su botón esté escuchando este evento, volverá a CanExecute para conocer el estado más reciente.

Aquí hay un article que podría ser de interés.