我有一个BusyIndicator,它将IsBusy绑定到我的视图模型中的Busy属性。
<xctk:BusyIndicator IsBusy="{Binding Busy}" x:Name="busyBox" Grid.Row="2"
HorizontalAlignment="Center"
VerticalAlignment="Center" BusyContent="Contacting Server" >
</xctk:BusyIndicator>
当我启动webservice调用(asynch)时,我将busy切换为true,并在回调时将其设置为false。
第一次这很好用,之后每次都不再显示忙碌指示。我在回调中添加了一个thread.sleep(仅在x =情况下第二次移动得太快了。)
我知道我的属性正在通知,因为其他绑定控件并按预期工作。似乎繁忙的指示器只适用于一次
(顺便说一句,我正在使用mvvm light toolkit v3)
查看模型代码
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
}
这是访问网络服务的类
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();
}
}
ui上的其他所有内容都表现得很好。我的按钮正确激活/停用。我的网格很好地更新等等
答案 0 :(得分:0)
我想我解决了它。 似乎(通常是这种情况)并通过发布上面的示例代码(删除我所有的测试混乱)我解决了它。
好吧这个模型有效,但是因为我正在对一个网络服务说话,并且在第一次通话之后我的网络服务电话非常快,因此我很快就看到了bsy infdicator。所以要解决这个问题......我懒得再睡一觉。但我把睡眠放在了回调中。所以,因为回调在ui线程中被触发,所以它在错误的点处被阻塞。忙碌的指示器在它睡着的时候已经过去了。
所以我把它移到了DoWork方法(在ui threqad之外)和繁忙的指示符sstays。
傻我。谢谢你的建议伙伴们!