J'ai un Menu
où chacun MenuItem
dans la hiérarchie a sa Command
propriété définie sur un RoutedCommand
que j'ai défini. L'associé CommandBinding
fournit un rappel pour l'évaluation de CanExecute
qui contrôle l'état activé de chacun MenuItem
.
Cela fonctionne presque . Les éléments de menu présentent initialement les états activés et désactivés corrects. Cependant, lorsque les données que mon CanExecute
rappel utilise changent, j'ai besoin de la commande pour demander à nouveau un résultat de mon rappel afin que ce nouvel état soit reflété dans l'interface utilisateur.
Il ne semble pas y avoir de méthodes publiques sur RoutedCommand
ou CommandBinding
pour cela.
Notez que le rappel est utilisé à nouveau lorsque je clique ou tape dans le contrôle (je suppose qu'il est déclenché en entrée car le survol de la souris ne provoque pas l'actualisation).
la source
Pour tous ceux qui rencontrent cela plus tard; Si vous utilisez MVVM et Prism, l'
DelegateCommand
implémentation de PrismICommand
fournit une.RaiseCanExecuteChanged()
méthode pour ce faire.la source
RaiseCanExecuteChanged()
simplement ses appelsCommandManager.InvalidateRequerySuggested()
.((RelayCommand)MyCommand).RaiseCanExecuteChanged();
a fonctionné pour moi, en utilisant GalaSoft.MvvmLight.Command - MAIS après le passage àCommandWPF
, cela a fonctionné sans avoir besoin d'appeler quoi que ce soit. Merci @ fuchs777Je ne pouvais pas utiliser
CommandManager.InvalidateRequerySuggested();
parce que mes performances étaient affectées.J'ai utilisé la commande de délégation de MVVM Helper , qui ressemble à ci-dessous (je l'ai un peu modifiée pour notre demande). vous devez appeler
command.RaiseCanExecuteChanged()
depuis VMla source
Si vous avez lancé votre propre classe qui implémente,
ICommand
vous pouvez perdre une grande partie des mises à jour automatiques de statut, vous obligeant à compter sur une actualisation manuelle plus que nécessaire. Cela peut aussi casserInvalidateRequerySuggested()
. Le problème est qu'uneICommand
implémentation simple ne parvient pas à lier la nouvelle commande auCommandManager
.La solution consiste à utiliser ce qui suit:
De cette façon, les abonnés s'attachent à
CommandManager
plutôt qu'à votre classe et peuvent participer correctement aux changements d'état des commandes.la source
J'ai implémenté une solution pour gérer la dépendance des propriétés sur les commandes, ici le lien https://stackoverflow.com/a/30394333/1716620
grâce à cela, vous finirez par avoir une commande comme celle-ci:
la source
C'est ce qui a fonctionné pour moi: mettez le CanExecute avant la commande dans le XAML.
la source