GridView不显示通过CollectionViewSource异步检索的数据

时间:2012-09-17 23:09:51

标签: c# xaml windows-8 async-await

我尝试做的是检索一组文件(异步),然后在由文件名的第一个字母分组的GridView中显示。

例如,如果文件名为“Pic”,则会显示在标题“P”的列下。

以下是我的View模型中的一些代码:

public ObservableCollection<File> Files { get; set; }
public List<FileCategory> Items { get; set; }
private FileRepository _fileRepository;
public MoviesPageViewModel()
{
        _fileRepository = new FileRepository();
        this.Construct();
        var filesByCategories = Files.GroupBy(x => x.Title[0].ToString())
            .Select(x => new FileCategory { Title = x.Key, Items = new ObservableCollection<File>(x)});
        Items = filesByCategories.ToList();
}  
private async void Construct()
    {
        Files = new ObservableCollection<File>();
        IList _files = await _fileRepository.GetFiles();
        foreach (File file in _files)
        {
            Files.Add(file);
        }
    }

以下是View中的CollectionViewSource

<CollectionViewSource
        x:Name="groupedItemsViewSource"
        Source="{Binding Items}"
        IsSourceGrouped="true"
        ItemsPath="Items"/>

来自同一视图的GridView(减去模板)

<GridView
    x:Name="itemGridView"
    AutomationProperties.AutomationId="ItemGridView"
    AutomationProperties.Name="Grouped Items"
    Margin="116,0,40,46"
    ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
    ItemTemplate="{StaticResource Standard250x250ItemTemplate}">

当我构建并运行时,屏幕上什么都没有。但是,我知道代码接近工作原因是:

  1. 删除构造函数中对Construct()的调用并替换它 用一些代码将一些File对象硬编码到文件中 集合产生所需的输出。
  2. 删除CollectionViewSource的使用并绑定     GridView直接到Files集合(仍然使用async     代码)在屏幕上显示集合,但当然不是     通过使用Items(并绑定GridView)来过滤     到项目也没有结果)
  3. 我认为这可能是因为我的Items集合没有任何更改通知,因此在初始加载后async调用正在进行时,集合不会更新到屏幕。

    有人知道为什么会发生这种情况和/或提供有关修复的建议吗?

    非常感谢!

2 个答案:

答案 0 :(得分:0)

问题是CollectionViewSource绑定到Items集合,并且您要将项目添加到Files集合

更改您的代码以添加到Items或将您的XAML更改为指向Files

您可能还需要调用添加操作

答案 1 :(得分:0)

我通过做一些改变让这个工作。

我将Items集合变成了ObservableCollection,然后移动了linq查询并将查询结果添加到异步Construct方法。

这感觉很乱,但它现在有效。谢谢大家!