wpf - ¿Cuál es la tarea real de CanExecuteChanged y CommandManager.RequerySuggested?
icommand wpf (2)
-
CanExecuteChangednotifica a los orígenes de comandos (como unButtono elemento deMenuItem) que están vinculados a eseICommandque el valor devuelto porCanExecuteha cambiado. A las fuentes de comandos les preocupa esto porque generalmente necesitan actualizar su estado en consecuencia (por ejemplo, unButtonse desactivará siCanExecute()devuelvefalse). - El evento
CommandManager.RequerySuggestedseCommandManager.RequerySuggestedcada vez queCommandManagercree 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:
- ¿Qué hace el evento
CanExecuteChanged? - ¿Qué hace el
CommandManager.RequerySuggested?
El código anterior es de la Clase RelayCommand desde here .
-
RoutedCommandspuede notificar automáticamente si suCanExecuteha cambiado, ya que estamos implementandoICommandaquí, que el sistema WPF desconoce, losRequerySuggestedevento RequerySuggested deRequerySuggested. - 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á aCanExecutepara conocer el estado más reciente.
Aquí hay un article que podría ser de interés.