我正在尝试做的是检索文件集合(异步),然后显示在按文件名的第一个字母分组的 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}">
当我构建和运行时,屏幕上什么也没有。但是,我知道代码即将开始工作,因为:
- 在构造函数中删除对 Construct() 的调用并将其替换为一些代码以将一些 File 对象硬编码到 Files
集合中会产生所需的输出。 - 删除 CollectionViewSource 的使用并将 GridView 直接绑定到 Files 集合(并且仍然使用异步代码)会在屏幕上显示集合,但当然它们不会被过滤,因为这绕过了 Items 的使用(并将 GridView 绑定到 Items也不产生任何结果)
我相信这可能是因为我的 Items 集合没有任何更改通知,因此集合没有更新到屏幕,因为异步调用在初始加载后进行。
有人知道为什么会发生这种情况和/或提供有关修复的任何建议吗?
非常感谢!