8
votes

CommandManager.InvalidateRequerySugied ne provoque pas de requêche sur Canexecute en MVVM-Light

J'utilise MVVM-Light RelayCommand

// force the GUI to re-evaluate the state of the buttons
CommandManager.InvalidateRequerySuggested();


2 commentaires

Actuellement, il y a une implémentation de relaiscommand dans un espace de noms supplémentaire: galasoft.mvvmlight.commandwpf 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


7 Réponses :


7
votes

Il y a des suggestions de beaucoup là-bas ( ici , ici , ici ).

J'utilise une solution simple mais pas si belle. J'appelle simplement onpropertychanged ("myicommand") pour mes commandes dans mon Backworker Evénement terminé.


2 commentaires

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) pour mettre à jour chaque propriété , y compris les commandes (qui réévalueront les commandes Canexecute)



0
votes

Je suppose que vous pouvez appeler " revert.raisecanexecuTecharged () " méthode à " isrevertenableabled " inpc (ou propriété de dépendance). Cela obligera le " caneuvertexecute " "prédicat.


1 commentaires

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 - = '



0
votes

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;     
}


0 commentaires

4
votes

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);
    //            }
}


1 commentaires

Actuellement, il y a une implémentation de relaiscommand dans un autre espace de noms: Galasoft.mvvmlight.commandwpf qui résout spécifiquement ce problème!



40
votes

Juste pour ajouter une autre solution possible, j'avais besoin d'appeler CommandManager.InvalidateRequerySugged sur le three d'interface utilisateur à l'aide de Application.Current.dispatcher.invoke .


5 commentaires

C'est ce que j'avais besoin de faire


+1 pour le conseil sur le thread d'interface utilisateur . 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.



0
votes

juste appeler revert.raisecanexecuTecharged ();


0 commentaires

0
votes

@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 , vous voyez la remarque suivante: < Pré> xxx


0 commentaires