1

Windows 8 スタイル アプリでは、カスタム FileService でファイルのリストを取得する次のコードがあります。これは、ViewModel のコンストラクターで発生しています。

private async void Construct()
{
   Files = new ObservableCollection<FileViewModel>();
   IList _files = await _fileRepository.GetFiles();
   foreach (File file in _files)
   {
      Files.Add(new FileViewModel(file));
   }
}

それは完全に機能しますが、私が理解するのに苦労しているのは、ファイルのロード中に何かが起こっていることをユーザーに通知するために、これについて進捗レポートを実行する方法です。

それを見ると、ビューの ProgressRing のようなものにバインドできる bool IsBusy プロパティが必要です。プロセスの開始時にこれを true に設定できることがわかりましたが、このプロパティを False に設定できる操作から Completed コールバックを取得するにはどうすればよいですか?

どうもありがとう!

4

1 に答える 1

1

まず、メソッドを使用すべきではないと思いますasync void(もちろん、イベント ハンドラーでない限り)。「非同期コンストラクター」は、静的asyncファクトリ メソッドとして、または非同期の遅延初期化を使用して実装するのが最適です (私のブログで説明されています)。これらのアプローチは両方とも よりも優れていasync voidます。

では、進捗報告に移ります。タスクベースの非同期プログラミングのドキュメントでは、進行状況を報告するための推奨される方法について説明しています。また、私のAsyncExライブラリには、進行状況の更新を ViewModel の監視可能なプロパティとして処理するために特別にIProgress<T>呼び出された実装が含まれています。PropertyProgress

ただし、完全な「進行状況レポート」ではなく、「ビジー インジケーター」だけが必要なようです。これはかなり単純です。

private async Task Construct()
{
  Files = new ObservableCollection<FileViewModel>();
  IsBusy = true;
  IList _files = await _fileRepository.GetFiles();
  IsBusy = false;
  foreach (File file in _files)
  {
    Files.Add(new FileViewModel(file));
  }
}

IsBusyこの例では、セッターが適切にレイズすると仮定していINotifyPropertyChanged.PropertyChangedます。

于 2012-09-26T22:12:07.883 に答える