WCF サービスを使用しています
私はこの問題を抱えています:
非同期関数呼び出しの開始時に GridView のサーバーからデータを取得するときに、IsBusy = "True"
. メソッドが呼び出された後、 を設定しIsBusy = "False"
ます。メソッド呼び出し中はRadBusyIndicator
表示されません。何が問題なのか理解できません。
この問題を含む簡単なプロジェクトをアップロードしました。確認できますか?ダウンロード
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();
}
}
コントローラーで IsBusy プロパティのバインディングを使用している場合は、INotifyPropertyChanged インターフェイスを実装して、バインディング プロパティの値が変更されたときに UI にその変更が通知され、それ自体が更新されるようにする必要があります。ビュー モデルには、次のようにセッターを持つプロパティが必要です。
public bool Busy
{
get{return _Busy;}
set
{
if(value != _Busy)
_Busy = value;
OnPropertyChanged("Busy");
}
}
これにより、UI に変更が通知されます。すでにこれを行っている場合は、さらに役立つ関連コードをもっと見る必要があります。
IsBusy プロパティを文字列値に設定している場合、最後の投稿をもう一度見た後、そのプロパティはブール値を取るため、これが問題です。
ウィンドウの xaml がビジー インジケーター内にない場合、表示されない場合があります。そのコントロールを使用して、ビジー インジケーターが true に設定されているときにマスクしたいコンテンツをインジケーター タグ内に配置する必要があります。UserControl の主要な表示項目がグリッドの場合は、ビジー インジケーター タグでグリッドをラップします。
<UserControl>
<telerik:RadBusyIndicator IsBusy={Binding Busy}>
<Grid>
content...
</Grid>
</telerik:RadBusyIndicator>
</UserControl>
これにより、探している結果が得られるはずです。
読み込みを 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();
}
コードに基づいて、メイン ウィンドウのコンテンツ コントロールにビジー インジケーターのみを配置したいと考えています。メイン ウィンドウのビュー モデルを作成し、それをページのデータ コンテキストとして使用することをお勧めします。また、上で説明したようにビュー モデルにプロパティを設定し、そのプロパティへのバインディングを設定します。ビュー モデルでは、データ ストアへの非同期呼び出しを行い、戻り時にコレクション プロパティを入力し (ObservableCollection をお勧めします)、ListBox の IitemsSource プロパティをそれにバインドできます。これが役立つことを願っています