3

BusyIndi​​catorがあり、ビューモデルのBusyプロパティにIsBusyをバインドしています。

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

Webサービス呼び出し(非同期)を開始するときにbusyをtrueに切り替え、コールバックでfalseに設定します。

これは、最初はうまく機能し、その後は毎回ビジーインジケーターが表示されなくなります。コールバックにthread.sleepを追加しました(x = caseの場合、2回目は動きが速すぎました)。

他のバインドされたコントロールが期待どおりに機能しているため、プロパティが正しく通知していることを知っています。ビジーインジケーターは1回の使用にのみ適しているようです

(ところで、私は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();
    }
}

UIの他のすべてはうまく動作します。私のボタンは正しくアクティブ化/非アクティブ化されます。私のグリッドはうまく更新されますなど

4

1 に答える 1

0

私はそれを解決したと思います。それはそうです(そしてしばしばそうです)そして上記のサンプルコードを投稿することによって(私のテストの混乱をすべて取り除くことで)私はそれを解決しました。

モデルは機能しますが、Webサービスと話しているので、最初の呼び出しの後、Webサービスの呼び出しは非常に高速で、その後は動きが速すぎてbsyインジケーターが表示されませんでした。

だからそれを回避するために......私は怠惰になり、睡眠を追加しました。しかし、私はコールバックにスリープを入れました。したがって、コールバックはUIスレッドで起動されるため、間違ったポイントでブロックされていました。ビジーインジケーターは、スリープ状態になるまでにすでに出入りしていました。

だから私はそれをDoWorkメソッド(ui threqadの外にあります)に移動しました、そしてビジーインジケーターはとどまります。

愚かな私。アドバイスフェローに感謝します!

于 2012-11-29T09:56:51.177 に答える