Tengo un lugar Menu
donde cada uno MenuItem
en la jerarquía tiene su Command
propiedad establecida en una RoutedCommand
que he definido. El asociado CommandBinding
proporciona una devolución de llamada para evaluar CanExecute
qué controla el estado habilitado de cada uno MenuItem
.
Esto casi funciona. Los elementos del menú aparecen inicialmente con los estados habilitados y deshabilitados correctos. Sin embargo, cuando los datos que CanExecute
utiliza mi devolución de llamada cambian, necesito el comando para volver a solicitar un resultado de mi devolución de llamada para que este nuevo estado se refleje en la interfaz de usuario.
No parece haber ninguna métodos públicos en RoutedCommand
o CommandBinding
para esto.
Tenga en cuenta que la devolución de llamada se usa nuevamente cuando hago clic o escribo en el control (supongo que se activa en la entrada porque el mouse-over no causa la actualización).
fuente
Para cualquiera que se encuentre con esto más tarde; Si utiliza MVVM y Prism, la
DelegateCommand
implementación de PrismICommand
proporciona un.RaiseCanExecuteChanged()
método para hacerlo.fuente
RaiseCanExecuteChanged()
simplemente llamaCommandManager.InvalidateRequerySuggested()
.((RelayCommand)MyCommand).RaiseCanExecuteChanged();
funcionó para mí, usando GalaSoft.MvvmLight.Command - PERO después de cambiar aCommandWPF
, funcionó sin la necesidad de llamar a nada. Gracias @ fuchs777No pude usar
CommandManager.InvalidateRequerySuggested();
porque me estaba afectando el rendimiento.He usado el comando Delegar de MVVM Helper , que se ve a continuación (lo he modificado un poco para nuestra solicitud). tienes que llamar
command.RaiseCanExecuteChanged()
desde VMfuente
Si ha implementado su propia clase que implementa
ICommand
, puede perder muchas de las actualizaciones de estado automáticas que lo obligan a confiar en la actualización manual más de lo necesario. También puede romperseInvalidateRequerySuggested()
. El problema es que unaICommand
implementación simple no puede vincular el nuevo comando alCommandManager
.La solución es usar lo siguiente:
De esta forma, los suscriptores se unen a
CommandManager
su clase en lugar de a su clase y pueden participar adecuadamente en los cambios de estado del comando.fuente
He implementado una solución para manejar la dependencia de la propiedad en los comandos, aquí el enlace https://stackoverflow.com/a/30394333/1716620
gracias a eso terminarás teniendo un comando como este:
fuente
Esto es lo que funcionó para mí: poner el CanExecute antes del comando en el XAML.
fuente