【问题标题】:wpf extended toolkit BusyIndicator binding to propertywpf 扩展工具包 BusyIndi​​cator 绑定到属性
【发布时间】:2012-11-16 15:18:05
【问题描述】:

我有一个 BusyIndi​​cator,我将 IsBusy 绑定到我的视图模型中的 Busy 属性。

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

我在启动 web 服务调用(异步)时将忙切换为 true,并在回调中将其设置为 false。

第一次效果很好,之后每次都不再显示忙碌指示符。我在回调中添加了一个 thread.sleep (只是在 x=case 它第二次移动得太快了)。

我知道我的属性正在正确通知,因为其他绑定控件并按预期工作。似乎busyindicator只适用于一次使用

(顺便说一句,我正在使用 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         
    }

这是访问 web 服务的类

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();
    }
}

用户界面上的其他所有内容都表现得很好。我的按钮正确激活/停用。我的网格得到很好的更新等等等等

【问题讨论】:

  • 你能发布你的回调视图模型的代码吗?
  • 如果 BusyIndi​​cator 控件是问题所在,您始终可以创建自己的控件。它并不像看起来那么难(您只需将 Busy 指示器和 View 内容放在一个没有行的网格中,并将指示器的 Visibility 绑定到您的 Busy 属性)。
  • 我认为这不是 BusyIndi​​cator,可能是异步线程问题。也许与 WPF 的视觉线程有关。也许它使用SynchronizationContextIsBusy 属性设置回false 来解决。
  • 还必须添加 DataContext 项的代码。
  • @RaulOtaño 我认为你是对的。我做了一个没有异步的小示例应用程序,指标的行为与我预期的一样。我正在使用 backgroundWorker 来做我的网络服务调用。在 DoWork() 方法中,busy 设置为 true,在传递类并由 RunWorkerCompleted() 方法启动的回调方法中,busy 设置为 false。进程在 RunWorkerAsync() 中触发。我认为 RunWorkerCompleted 自动在 UI 线程内运行?还是我应该做一些特别的事情?生病发布一些示例代码

标签: wpf mvvm-light wpftoolkit


【解决方案1】:

我想我解决了。 似乎(并且经常如此)并且通过发布上面的示例代码(删除我所有的测试混乱)我解决了它。

好的模型可以工作,但是因为我正在与网络服务通话,并且在第一次调用之后,我的网络服务调用速度非常快,之后它的移动速度太快了,我看不到 bsy 指示符。

所以为了解决这个问题......我变得懒惰并增加了睡眠。但我把睡眠放在回调中。因此,由于回调在 ui 线程中被触发,因此它在错误的点阻塞。忙碌指示符在进入睡眠状态时已经来来去去。

所以我把它移到了 DoWork 方法中(它在 ui threqad 之外)并且忙碌指示器保持不变。

愚蠢的我。谢谢各位大侠的建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多