1

WCF サービスを使用しています

私はこの問題を抱えています:

非同期関数呼び出しの開始時に GridView のサーバーからデータを取得するときに、IsBusy = "True". メソッドが呼び出された後、 を設定しIsBusy = "False"ます。メソッド呼び出し中はRadBusyIndicator表示されません。何が問題なのか理解できません。

この問題を含む簡単なプロジェクトをアップロードしました。確認できますか?ダウンロード

4

5 に答える 5

0

OK、私はあなたの問題を見ます。プロキシの Close メソッドは、非同期呼び出しの結果を待ちます。client.Close(); を移動するだけです。GetCustomersCompleted メソッドで、これは機能します。(サンプルでテスト済み)

private proxy.ServicesClient client = null;
private void LoadData()
{
    App.Instance.SetBusy();

    client = new proxy.ServicesClient();
    client.GetCustomersCompleted += (s, e) =>
    {
        if (e.Error != null)
        {
            throw new Exception();
        }
        else
        {
            Customers = new ObservableCollection<CustomerModel>();

            foreach (var item in e.Result)
            {
                Customers.Add(new CustomerModel()
                    {
                        CustomerId = item.CustomerId,
                        Title = item.Title,
                        FirstName = item.FirstName,
                        MiddleName = item.MiddleName,
                        LastName = item.LastName,
                        CompanyName = item.CompanyName,
                        SalesPerson = item.SalesPerson,
                        EmailAddress = item.EmailAddress,
                        Phone = item.Phone
                    });
            }

            OnPropertyChanged("Customers");
        }
        client.Close();//Close after the return
        App.Instance.UnSetBusy();
    };
    client.GetCustomersAsync();
    //client.Close();
}
}
于 2013-03-19T16:32:49.617 に答える
0

コントローラーで IsBusy プロパティのバインディングを使用している場合は、INotifyPropertyChanged インターフェイスを実装して、バインディング プロパティの値が変更されたときに UI にその変更が通知され、それ自体が更新されるようにする必要があります。ビュー モデルには、次のようにセッターを持つプロパティが必要です。

    public bool Busy
    {
        get{return _Busy;}
        set
        {
           if(value != _Busy)
             _Busy = value;
           OnPropertyChanged("Busy");
        }

    }

これにより、UI に変更が通知されます。すでにこれを行っている場合は、さらに役立つ関連コードをもっと見る必要があります。

IsBusy プロパティを文字列値に設定している場合、最後の投稿をもう一度見た後、そのプロパティはブール値を取るため、これが問題です。

于 2013-03-21T15:46:30.427 に答える
0

ウィンドウの xaml がビジー インジケーター内にない場合、表示されない場合があります。そのコントロールを使用して、ビジー インジケーターが true に設定されているときにマスクしたいコンテンツをインジケーター タグ内に配置する必要があります。UserControl の主要な表示項目がグリッドの場合は、ビジー インジケーター タグでグリッドをラップします。

<UserControl>
  <telerik:RadBusyIndicator IsBusy={Binding Busy}>
      <Grid>
         content...
      </Grid>
   </telerik:RadBusyIndicator>
</UserControl>

これにより、探している結果が得られるはずです。

于 2013-03-21T03:19:54.833 に答える
0

読み込みを BackgroundWorker に移動しました。これを試してもらえますか:

private void LoadData()
{
    //Activate BudyIndicator
    App.Instance.SetBusy();

    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += (o, ea) =>
    {
        ObservableCollection<CustomerModel> LoadedCustomers = null;

        //Create Client
        proxy.ServicesClient client = new proxy.ServicesClient();
        ObservableCollection<Customer> customers = client.GetCustomers();

        LoadedCustomers = new ObservableCollection<CustomerModel>();
        foreach (var item in customers)
        {
            LoadedCustomers.Add(new CustomerModel()
            {
                CustomerId = item.CustomerId,
                Title = item.Title,
                FirstName = item.FirstName,
                MiddleName = item.MiddleName,
                LastName = item.LastName,
                CompanyName = item.CompanyName,
                SalesPerson = item.SalesPerson,
                EmailAddress = item.EmailAddress,
                Phone = item.Phone
            });
        }
        client.Close();

        //Define return value
        ea.Result = LoadedCustomers;
    };
    worker.RunWorkerCompleted += (o, ea) =>
    {
        //Get returned value
        ObservableCollection<CustomerModel> model = ea.Result as ObservableCollection<CustomerModel>;
        if (model != null)
        {
            Customers = model;
        }

        //Desactivate BusyIndicator
        App.Instance.UnSetBusy();
    };
    worker.RunWorkerAsync();
}
于 2013-03-19T11:28:46.173 に答える
0

コードに基づいて、メイン ウィンドウのコンテンツ コントロールにビジー インジケーターのみを配置したいと考えています。メイン ウィンドウのビュー モデルを作成し、それをページのデータ コンテキストとして使用することをお勧めします。また、上で説明したようにビュー モデルにプロパティを設定し、そのプロパティへのバインディングを設定します。ビュー モデルでは、データ ストアへの非同期呼び出しを行い、戻り時にコレクション プロパティを入力し (ObservableCollection をお勧めします)、ListBox の IitemsSource プロパティをそれにバインドできます。これが役立つことを願っています

于 2013-03-21T20:12:01.927 に答える