Tengo un lugar Menudonde cada uno MenuItemen la jerarquía tiene su Commandpropiedad establecida en una RoutedCommandque he definido. El asociado CommandBindingproporciona una devolución de llamada para evaluar CanExecutequé 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 CanExecuteutiliza 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 RoutedCommando CommandBindingpara 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
DelegateCommandimplementación de PrismICommandproporciona 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 unaICommandimplementación simple no puede vincular el nuevo comando alCommandManager.La solución es usar lo siguiente:
De esta forma, los suscriptores se unen a
CommandManagersu 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