1

在 Windows 8 Style 应用程序中,我有以下代码检索自定义 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));
   }
}

它工作得很好,但我正在努力弄清楚我将如何对此执行进度报告以通知用户在加载文件时正在发生某些事情。

看着它,我想要一个 bool IsBusy 属性,我可以将它绑定到 View 上的 ProgressRing 之类的东西上。我知道我可以在进程开始时将此设置为 true,但是如何从操作中获取 Completed 回调,然后我可以将此属性设置为 False?

非常感谢!

4

1 回答 1

1

首先,我认为您不应该使用async void方法(当然,除非它们是事件处理程序)。“异步构造函数”最好实现为静态async工厂方法或异步延迟初始化(在我的博客中解释)。这两种方法都比async void.

现在,关于进度报告。基于任务的异步编程文档描述了报告进度的推荐方式,我的AsyncEx库包含一个IProgress<T>专门PropertyProgress用于将进度更新视为 ViewModel 可观察属性的实现。

但是,听起来您只需要一个“忙碌指示器”,而不是完整的“进度报告”。这有点简单:

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

在这个例子中,我假设IsBusysetter 会INotifyPropertyChanged.PropertyChanged适当地加注。

于 2012-09-26T22:12:07.883 回答