wpf - ¿Cuál es la tarea real de CanExecuteChanged y CommandManager.RequerySuggested?
icommand wpf (2)
-
CanExecuteChanged
notifica a los orígenes de comandos (como unButton
o elemento deMenuItem
) que están vinculados a eseICommand
que el valor devuelto porCanExecute
ha cambiado. A las fuentes de comandos les preocupa esto porque generalmente necesitan actualizar su estado en consecuencia (por ejemplo, unButton
se desactivará siCanExecute()
devuelvefalse
). - El evento
CommandManager.RequerySuggested
seCommandManager.RequerySuggested
cada vez queCommandManager
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:
- ¿Qué hace el evento
CanExecuteChanged
? - ¿Qué hace el
CommandManager.RequerySuggested
?
El código anterior es de la Clase RelayCommand
desde here .
-
RoutedCommands
puede notificar automáticamente si suCanExecute
ha cambiado, ya que estamos implementandoICommand
aquí, que el sistema WPF desconoce, losRequerySuggested
evento 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á aCanExecute
para conocer el estado más reciente.
Aquí hay un article que podría ser de interés.