2010-06-06 7 views
10

Estoy escribiendo una aplicación de WPF utilizando el patrón MVVM, basado en el artículo siguiente: WPF Apps With The Model-View-ViewModel Design PatternProgramáticos reevaluación de MVVM comando de "se puede ejecutar" estado

que tienen dos botones de mi vista con los botones " Comando "propiedad vinculada (con enlace de datos) a una instancia determinada de la clase RelayCommand (ver" Figura 3 La clase RelayCommand "del artículo anterior). La clase RelayCommand tiene soporte para verificar si el comando dado se puede ejecutar.

WPF deshabilita automáticamente los botones cuyo comando no se puede ejecutar.

Cada uno de mis comandos (en la clase ViewModel) inicia una operación en segundo plano, y el comando no se puede ejecutar nuevamente hasta que la operación de fondo haya finalizado. Las instancias de RelayCommand tienen información sobre si la operación de fondo todavía está funcionando o si está terminada.

Mi problema es el siguiente: después de presionar cualquiera de los botones, los botones se desactivan automáticamente (lo cual está bien) porque se inició la operación de fondo y el comando no puede ejecutarse hasta que finaliza, pero después de que la operación terminó , los botones no se activan automáticamente porque el predicado "se puede ejecutar" de su comando no se vuelve a evaluar automáticamente. La reevaluación se puede activar manualmente teniendo la aplicación suelta y recuperando el foco (presionando ALT + TAB). Después de hacer este truco, los botones se activan una vez más.

¿Cómo puedo reevaluar programáticamente el estado "puede ejecutar" del comando de los botones?

Respuesta

20

Puede llamar InvalidateRequerySuggested en el Administrador de comandos para notificar que CanExecute debe volver a consultar:

CommandManager.InvalidateRequerySuggested(); 

http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx

esto depende de si la implementación particular ICommand ha implementado correctamente el patrón ICommand.CanExecuteChanged , entonces YMMV.

actualización

Por ejemplo, utilizo prisma que tiene su propia implementación base ICommand: DelegateCommand. Me parece que llamar a RaiseCanExecuteChanged(), en un DelegateCommand en Prism funciona para mí.

Actualización 2

Y asegúrese de que usted está llamando InvalidateRequerySuggested() en el hilo de interfaz de usuario. Use el Dispatcher si es necesario para hacer la llamada.

+0

Esto es lo mismo que mi primera conjetura fue, pero, por alguna razón desconocida para mí, parece que no funciona. Llamo a este método estático ("CommandManager.InvalidateRequerySuggested") cada vez que cambia el estado del programa (como Idle, Working, PendingStop etc.), esta propiedad de estado solo se usa en los manejadores canExecute. Aún así, no parece funcionar (aunque estoy de acuerdo en que debería). Por cierto, ve y comprueba la implementación de ICommand, está en el artículo al que hice referencia anteriormente, figura 3. – dzs

+0

Sí, realmente depende de cómo se haya implementado ICommand. He actualizado mi respuesta detallando cómo puedo volver a consultar CanExecute en Prism. Veré el artículo que estás siguiendo. –

+0

¿Tiene esto algo que ver con la ejecución de InvalidateRequerySuggested() en un hilo que no sea UI?Intente utilizar Dispatcher para llamarlo, de modo que se invoque en el subproceso UI. –

Cuestiones relacionadas