2011-07-29 3 views
0

Mon application exécute un appel de service Web et lorsque cela se produit, l'état IsExecuting est défini sur true et le bouton d'exécution est désactivé. Comme l'application n'est pas réactive pendant cette période, je change le processus pour que l'exécution se fasse dans un thread séparé. Cependant, le problème que je remarque maintenant est que le bouton d'exécution est toujours désactivé et que lorsque je clique sur l'interface, le bouton est activé. Comment puis-je réparer cela?WPF CanExecute et ThreadPool

EDIT: En Codebehind:

private void Execute() 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(ExecuteThread)); 
} 

private bool CanExecute 
{ 
    get { return !IsExecuting; } 
} 

private void ExecuteThread(Object o) 
{ 
    IsExecuting = true; 

    // Process execution here ... 

    IsExecuting = false; 
} 


In Xaml: 

<Button Content="Execute" Command="{Binding Path=ExecCommand}"/> 

Répondre

2

Vous avez donc besoin de rafraîchir l'état CanExecute de vos commandes? Appelez simplement CommandManager.InvalidateRequerySuggested(), cela provoquera CanExecute d'être réévalué sur les commandes liées.

+0

J'ai essayé ceci en l'ajoutant comme dernière ligne dans la méthode ExecuteThread, mais cela n'a pas aidé. – Sys

+2

@Sys, essayez d'appeler cette méthode sur le thread UI (en utilisant Dispatcher.Current.Invoke) –

+0

J'ai essayé Application.Current.Dispatcher.Invoke (nouvelle Action (délégué {IsExecuting = true;})); mais encore ne fonctionne pas ... – Sys

0

Je pense que vous devriez un peu de code pour mieux comprendre votre problème.

Je suis tout à fait sûr qu'il s'agit d'un problème de thread car vous ne pouvez pas modifier l'état du formulaire d'un contrôle à partir d'un thread différent.

Je pense que tout ce que vous devez à est d'utiliser un délégué de mettre à jour l'état de votre bouton d'autres fils

How to update the GUI from another thread in C#?

+0

J'ai ajouté un extrait de code – Sys