J'utilise MVVM-Light RelayCommand
// force the GUI to re-evaluate the state of the buttons CommandManager.InvalidateRequerySuggested();
7 Réponses :
Il y a des suggestions de beaucoup là-bas ( ici A>, ici , ici ). p>
J'utilise une solution simple mais pas si belle. J'appelle simplement onpropertychanged ("myicommand") code> pour mes commandes dans mon
Backworker code> Evénement terminé. P>
Ce peut être une "non si belle solution de contournement", mais l'ONPROPERTYCHANGED (commande) a fait juste le tour pour moi. Merci pour cette idée. Je n'aurais jamais pensé à ça.
Si l'interface utilisateur n'est pas "lourd", vous pouvez appeler onpropertychanged (null) code> pour mettre à jour chaque propriété i>, y compris les commandes (qui réévalueront les commandes Canexecute)
Je suppose que vous pouvez appeler " revert.raisecanexecuTecharged () code>" méthode à "
isrevertenableabled code>" inpc (ou propriété de dépendance). Cela obligera le "
caneuvertexecute code>" "prédicat. P>
Cela crée une erreur de compilation: "Le système d'événement.windows.input.icommand.CanexecuTechargecked ne peut apparaître que sur le côté gauche de + = ou - = '
Je transformerais le drapeau isrévertenable dans une propriété et appelerais la méthode onproperTychanged à partir de là (vous devez implémenter l'interface InotifyProperTychanged). Au point où vous changez le drapeau, vous devez utiliser la propriété, par ex. Isrevertenabled = true.
private bool isRevertEnabled; public bool IsRevertEnabled { get { return isRevertEnabled; } set { if (isRevertEnabled != value) { isRevertEnabled = value; OnPropertyChanged("IsRevertEnabled"); } } } private bool CanRevertExecute() { return IsRevertEnabled; }
Selon l'article «Permettre à CommandManager d'interroger vos objets ICommand '. Le problème est que la commande est une commande non routée.
J'ai fait une nouvelle mise en œuvre du relais-lumière MVVMCommand comme suit: P>
// original //public event EventHandler CanExecuteChanged; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void RaiseCanExecuteChanged() { CommandManager.InvalidateRequerySuggested(); // var handler = CanExecuteChanged; // if (handler != null) // { // handler(this, EventArgs.Empty); // } }
Actuellement, il y a une implémentation de relaiscommand code> dans un autre espace de noms:
Galasoft.mvvmlight.commandwpf code> qui résout spécifiquement ce problème!
Juste pour ajouter une autre solution possible, j'avais besoin d'appeler CommandManager.InvalidateRequerySugged code> sur le three d'interface utilisateur à l'aide de
Application.Current.dispatcher.invoke code>. P >
C'est ce que j'avais besoin de faire
+1 pour le conseil sur le thread d'interface utilisateur code>. Je l'ai appelé sur un fil de fond et rien ne s'est passé
Avec je pouvais la voter à nouveau. Je me demande pourquoi cela n'est pas fait par défaut à l'intérieur de MVVMLight
Placez-vous ce code dans ViewModel ou sur Code de fond de la vue? Désolé je ne suis pas capable de comprendre comment l'appeler sur le fil de l'interface utilisateur?
J'ai placé cet appel dans la viewModel. Application.Current.Dispatcher.Invoke prend un délégué qu'il fonctionne sur le fil de l'interface utilisateur. Voir le MSDN pour plus d'informations.
juste appeler revert.raisecanexecuTecharged (); code> p>
@heltonbiker a déjà signalé cela dans des commentaires, mais la solution consiste à modifier les espaces de noms.
Si vous regardez la source de relaisCommand code>, vous voyez la remarque suivante: p> < Pré> xxx pré> p>
Actuellement, il y a une implémentation de
relaiscommand code> dans un espace de noms supplémentaire:
galasoft.mvvmlight.commandwpf code> qui résout spécifiquement ce problème!
J'ai essayé toutes les réponses ci-dessous, rien n'a fonctionné. Mais en utilisant Galasoft.MVVMLight.comMandwpf.RelayCommand au lieu de cela résolu pour moi. Merci @heltonbiker