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
Pouvez-vous poster du code pour ViewModel de votre rappel? –
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é). –
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. –