Cómo funciona CommandManager.¿Trabajo requerido?


El MSDN solo indica que

Ocurre cuando CommandManager detecta condiciones que podrían cambiar la capacidad de ejecución de un comando.

Sin embargo, parece que no puedo encontrar ningún rastro de cómo funciona esto, lo que debería saber / evitar, etc... ¿Solo escucha la entrada? (es decir: el ratón se mueve, las teclas pulsadas y así sucesivamente)

Author: Andrei Rînea, 2010-05-04

2 answers

No puedo decirte exactamente qué eventos escucha CommandManager. Sin embargo, puedo decirle que debe tener cuidado al usar CommandManager en relación con operaciones asíncronas. Tuve el siguiente problema cuando usé el CommandManager en mis ICommand implementaciones:

Tenía un botón vinculado a un ICommand que activaba una operación asíncrona que aumentaba un valor. Ahora, el botón / ICommand debe desactivarse (es decir, su método CanExecute() debe devolver false) si el valor había alcanzado un cierto límite. El problema fue: El CommandManager llamó a mi método CanExecute() justo después de que se hiciera clic en el botón y se iniciara la operación asíncrona. Esta operación asíncrona no tomó mucho tiempo, pero fue lo suficientemente larga como para obtener su resultado después de la comprobación de CommandManager, de modo que la comprobación de límite en CanExecute() se realizó utilizando el valor antiguo. Por lo tanto, el botón permaneció habilitado aunque el límite se alcanzó realmente. Lo curioso fue que, después de hacer clic en cualquier parte de la interfaz de usuario, el botón ahora se desactivó porque el CommandManager comprobó el ICommand una vez más y ahora el nuevo valor se comprobó contra el límite. En realidad, creo que el CommandManager esperó alrededor de 50 ms después del clic del botón hasta que realizó la comprobación del ICommand, pero no estoy muy seguro de eso.

Mi solución fue forzar el CommandManager para comprobar el ICommand de nuevo llamando a la CommandManager.InvalidateRequerySuggested método en mi ViewModel justo después de recibir el resultado de la operación async. Actualización: Tenga en cuenta que este método debe ser llamado en el subproceso de interfaz de usuario, de lo contrario no tendrá ningún efecto! (Gracias a midspace por este comentario)

 45
Author: gehho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-16 06:54:24

En ese caso, la fuente de referencia.NET es su amigo. Aunque está mal comentado todavía se pueden obtener algunas ideas sobre el procesamiento interno.

En la clase interna CommandDevice se encuentra un método PostProcessInput que invoca el InvalidateRequerySuggested. El nombre de este método permite suponer que el método InvalidateRequerySuggested se invoca en cada evento de entrada. Estoy seguro de que hay más procesamiento y filtrado para que su método CanExecute en realidad no es invocado en cada llamada a InvalidateRequerySuggested.

 4
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-28 09:12:37