WPF - Comment forcer une Commande de ré-évaluer " CanExecute via sa CommandBindings
J'ai un Menu
où chaque MenuItem
dans la hiérarchie a son Command
propriété est définie sur un RoutedCommand
j'ai défini. Les associés CommandBinding
fournit un rappel pour l'évaluation de CanExecute
qui contrôle l'état activé de chaque MenuItem
.
Ce presque œuvres. Les éléments de menu d'arriver à la bonne activé et désactivé. Toutefois, lorsque les données de mon CanExecute
de rappel utilise les changements, j'ai besoin de la commande de re-demande à la suite de mon rappel à l'ordre pour que ce nouvel état d'être reflété dans l'INTERFACE utilisateur.
Il ne semble pas y avoir de méthodes publiques sur RoutedCommand
ou CommandBinding
pour cela.
Remarque que le rappel est utilisé à nouveau quand je cliquez ou tapez sur la commande (je suppose que c'est déclenché sur l'entrée, car le passage de la souris ne cause pas de l'actualiser).
Vous devez vous connecter pour publier un commentaire.
Pas la plus jolie dans le livre, mais vous pouvez utiliser le Gestionnaire de commandes pour invalider toutes les commandbinding:
Voir plus d'informations sur MSDN
Pour quelqu'un qui vient sur cela plus tard; Si vous arrive d'être en utilisant MVVM et Prism, puis du Prisme de
DelegateCommand
mise en œuvre deICommand
fournit un.RaiseCanExecuteChanged()
méthode pour ce faire.RaiseCanExecuteChanged()
appelle simplementCommandManager.InvalidateRequerySuggested()
.((RelayCommand)MyCommand).RaiseCanExecuteChanged();
a fonctionné pour moi, à l'aide de GalaSoft.MvvmLight.Commande MAIS après avoir changé deCommandWPF
, il a travaillé sans la nécessité d'appeler quoi que ce soit. Merci @fuchs777Je ne pourrais pas utiliser
CommandManager.InvalidateRequerySuggested();
parce que je recevais des performances.J'ai utilisé MVVM Helper's Déléguant commande, qui ressemble à celui ci-dessous (j'ai modifié un peu pour notre req). vous devez appeler
command.RaiseCanExecuteChanged()
de VMSi vous avez roulé votre propre classe qui implémente
ICommand
vous pouvez perdre beaucoup de l'état automatique des mises à jour en vous forçant à s'appuyer sur manuel rafraîchissante plus qu'ils ne devraient pas être nécessaires. Il peut aussi briserInvalidateRequerySuggested()
. Le problème est qu'une simpleICommand
mise en œuvre ne parvient pas à lier la nouvelle commande à laCommandManager
.La solution est d'utiliser les éléments suivants:
De cette façon, les abonnés de la joindre à
CommandManager
plutôt que de votre classe et peut valablement participer à commande les changements d'état.J'ai mis en place une solution pour gérer la propriété de dépendance sur les commandes, voici le lien https://stackoverflow.com/a/30394333/1716620
grâce à cela que vous finirez par avoir une commande comme ceci:
C'est ce qui a fonctionné pour moi: Mettre le CanExecute avant la Commande dans le code XAML.