2012-11-28 5 views
3

J'ai un BusyIndicator, que je lie le IsBusy à ma propriété Busy dans mon modèle de vue.wpf boîte à outils étendue liaison BusyIndicator à la propriété

<xctk:BusyIndicator IsBusy="{Binding Busy}" x:Name="busyBox" Grid.Row="2" 
       HorizontalAlignment="Center" 
      VerticalAlignment="Center" BusyContent="Contacting Server" > 
    </xctk:BusyIndicator> 

je passe occupé pour vrai que je commence un appel webservice (asynch), et mettez-le à false sur le rappel.

Cela fonctionne très bien la 1ère fois, à chaque fois après cela, il n'affiche plus l'indicateur occupé. J'ai ajouté un thread.sleep dans le rappel (juste dans x = cas il se déplaçait trop vite la 2ème fois).

Je sais que ma propriété est en train de notifier correctement car d'autres contrôles liés fonctionnent comme prévu. il semble juste que le busyindicator est bon pour une seule utilisation

(BTW j'utilise boîte à outils de lumière MVVM v3)

VIEW MODELE CODE

this.Busy = true; //This proverty is declared correctly with notifications etc 
IPersonSearchService searcher = new PersonSearchService(); //class that does my  webservice, ad i pass it a callback method from my UI (see below) 
searcher.FindByPersonDetails(ps, GetAllPeopleCallback); 


private void GetAllPeopleCallback (PersonSearchResult result, Exception e) 
    { 
     this.Busy = false; 
     ((Models.PersonSearch)this.Model).Persons = result.Persons; //bound to my grid 
     CommandManager.InvalidateRequerySuggested(); //i need to do this to make a button who's canexecute command binding happen   
    } 

C'est la classe qui frappe le webservice

class PersonSearchService : IPersonSearchService 
{ 
    public void FindByPersonDetails(WSPersonSearch.PersonSearch ps, Action<PersonSearchResult, Exception> Callback) 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 

     worker.DoWork += delegate(object s, DoWorkEventArgs args) 
     { 
      WSPersonSearch.PersonSearch search = (WSPersonSearch.PersonSearch)args.Argument; 
      PersonSearchWebServiceClient wc = new PersonSearchWebServiceClient(); 
      PersonSearchResult r = wc.FindByPersonDetails(ps); 
      args.Result = r; 
     }; 

     worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args) 
     { 
      PersonSearchResult result = (PersonSearchResult)args.Result; 
      Callback(result, null); 
     }; 

     worker.RunWorkerAsync(); 
    } 
} 

tout le reste sur l'interface utilisateur se comporte bien. mes boutons s'activent/se désactivent correctement. ma grille est mise à jour joliment etc etc

+0

Pouvez-vous poster du code pour ViewModel de votre rappel? –

+0

Si le contrôle BusyIndicator est le problème, vous pouvez toujours créer votre propre contrôle. Ce n'est pas si difficile que ça en a l'air (il vous suffit de mettre votre indicateur Occupé et votre contenu View dans une grille sans lignes et de lier la visibilité de l'indicateur à votre propriété Occupé). –

+0

Je pense que ce n'est pas le BusyIndicator, peut-être pourrait être un problème de thread d'asynchronisation. Peut-être avec les fils visuels de WPF. Peut-être résoudre cela en utilisant un 'SynchronizationContext' pour remettre la propriété' IsBusy' à false. –

Répondre

0

Je pense que je l'ai résolu. Il semble (et c'est souvent le cas) et en publiant l'exemple de code ci-dessus (en supprimant tout mon gâchis de test) je l'ai résolu.

ok le modèle fonctionne, mais parce que je parle à un service web et après le 1er appel, mon appel de service web est plus rapide et plus tard, il se déplaçait trop vite pour moi de voir le bsy infdicator. Donc, pour contourner ce ...... je me suis paresseux et a ajouté une nuit de sommeil. mais j'ai mis le sommeil dans le rappel. donc depuis que le rappel est déclenché dans le thread ui il bloquait au mauvais point. l'indicateur occupé était déjà venu et parti au moment où il a frappé le sommeil. Donc je l'ai déplacé dans la méthode DoWork (qui est en dehors de l'ui threqad) et les sstays de l'indicateur occupé.

idiot moi. merci les conseils aux boursiers!

Questions connexes