2010-08-15 5 views
3

J'utilise l'interface ICommand pour effectuer une liaison sur quelques boutons de mon application, le bouton Exécuter et Fermer. J'utilise une méthode d'assistance qui a été mentionné dans this question de brancher le ICommand à un délégué comme suit:Comment actualiser manuellement une fenêtre dans WPF?

_someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething); 

private ICommand _someCommand; 

public ICommand SomeCommand 
{ 
    get { return _someCommand; } 
} 

private void DoSomething(object state) 
{ 
    // do something here 
} 

private bool CanDoSomething(object state) 
{ 
    // return true/false here is enabled/disable button 
} 

Cela semble fonctionner très bien que, dans ma mise en œuvre, CanDoSomething renvoie la valeur d'une propriété que j'ai dans ma demande.

Si je mets la valeur initiale de la propriété sur true, le bouton est activé et le faux est désactivé.

J'ai une série d'événements qui sont remontés d'un BackgroundWorker dans la couche d'application vers le ViewModel qui changent la valeur de la propriété à true ou false en fonction de l'état actuel de l'application.

Le problème actuel, je vais avoir est que le bouton n'est pas « réactiver » quand je mets la valeur true après le travail est terminé. Si je clique quelque part dans la fenêtre, il mettra à jour. Donc, par conséquent, je pense que rafraîchir manuellement la fenêtre va résoudre mon problème, au moins pour l'intérim. C'est un peu dégoûtant de le faire de cette façon, mais je ne sais pas du tout ce que je pourrais essayer d'autre.

Si quelqu'un a des suggestions, je suis tout ouïe.

Merci pour l'aide!

Ian

Edition -

Un peu plus d'informations sur l'application elle-même. Il utilise un travailleur d'arrière-plan dans le thread d'application pour gérer le "travail". L'application est un utilitaire simple pour gérer la création de tables et le chargement de données dans les tables. Nous utilisons beaucoup de scripts SQL prédéfinis pour configurer notre environnement de test. Il s'agit donc d'un utilitaire simple qui nous permet de faire ce genre de chose en fonction des paramètres fournis par l'utilisateur dans l'interface utilisateur.

Espérons qui aide, parce que quand je relis ma question, il lu comme si je faisais tout dans le thread d'interface utilisateur, ce qui est le cas. Les rapports d'avancement sont remontés jusqu'au thread d'interface utilisateur et tout est mis à jour comme prévu, sauf le bouton.

Répondre

4

CommandManager.InvalidateRequerySuggested() peut être la réponse - il indique à toutes les commandes de vérifier si elles sont activées ou non.

+0

Parfait - comme il n'y a que deux commandes que j'utilise et que toutes deux ont besoin d'être mises à jour, cela fonctionne parfaitement. –

Questions connexes