0

我正在构建一个 Windows 8 应用商店应用程序,但 CollectionViewSource 声称它返回的集合在涉及异步时有零项。

在我的 ViewModel 中,我有以下代码(请注意缺少一些内容以使其更易于解释)

public MainViewModel(IFileRepository fileRepository)
{
   items = new CollectionViewSource();
   _fileRepository = fileRepository;
   this.Construct();
   items.Source = new ObservableCollection<FileViewModel>(Files);
}

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

private CollectionViewSource items;
public ICollectionView Items
{
    get
    {
        return items.View;
    }
}

然后在 XAML 中,我将 GridView 的 ItemsSource 绑定到 Items,并且我拥有所有相关的 DataTemplates 来显示数据。

我的问题是,由于文件的异步获取,我的 Items 集合返回空并且 View 不显示任何数据。

如果我删除异步调用并内联创建 File 对象的模拟集合,则代码将按预期工作。

任何人都可以提出解决这个问题的方法吗?在 WPF 中,我会尝试为集合加载时创建一个布尔 isBusy 属性,但是对于这个新的异步内容来说,这感觉像是错误的事情。

任何指针都会很棒!

克里斯

4

1 回答 1

1

就目前而言,当您为 Source 创建 ObservableCollection 时,Files 是空的,因为您启动了 Construct,但没有(a)等待它完成。

我会避免使用第二个“包装器”ObservableCollection 并设置 Source = Files,因此当 Construct 代码写入文件时,CollectionViewSource 会观察到它(这可能是您的实际意图)

于 2012-09-16T20:02:27.240 回答