wpf扩展工具包BusyIndi​​cator绑定到属​​性

时间:2012-11-28 17:15:01

标签: wpf mvvm-light wpftoolkit

我有一个BusyIndi​​cator,它将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上的其他所有内容都表现得很好。我的按钮正确激活/停用。我的网格很好地更新等等

1 个答案:

答案 0 :(得分:0)

我想我解决了它。 似乎(通常是这种情况)并通过发布上面的示例代码(删除我所有的测试混乱)我解决了它。

好吧这个模型有效,但是因为我正在对一个网络服务说话,并且在第一次通话之后我的网络服务电话非常快,因此我很快就看到了bsy infdicator。

所以要解决这个问题......我懒得再睡一觉。但我把睡眠放在了回调中。所以,因为回调在ui线程中被触发,所以它在错误的点处被阻塞。忙碌的指示器在它睡着的时候已经过去了。

所以我把它移到了DoWork方法(在ui threqad之外)和繁忙的指示符sstays。

傻我。谢谢你的建议伙伴们!