1

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

例如,如果一个文件名为“Pic”,它将显示在标题“P”内的列下。

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

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

这是视图中的 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 对象硬编码到 Files
    集合中会产生所需的输出。
  2. 删除 CollectionViewSource 的使用并将 GridView 直接绑定到 Files 集合(并且仍然使用异步代码)会在屏幕上显示集合,但当然它们不会被过滤,因为这绕过了 Items 的使用(并将 GridView 绑定到 Items也不产生任何结果)

我相信这可能是因为我的 Items 集合没有任何更改通知,因此集合没有更新到屏幕,因为异步调用在初始加载后进行。

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

非常感谢!

4

2 回答 2

0

问题是CollectionViewSource绑定到Items集合并且您正在向集合中添加Files项目

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

您可能还需要调用 Add 操作

于 2012-09-17T23:15:35.867 回答
0

我通过进行一些更改来实现这一点。

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

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

于 2012-09-17T23:37:19.103 回答