我尝试做的是检索一组文件(异步),然后在由文件名的第一个字母分组的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}">
当我构建并运行时,屏幕上什么都没有。但是,我知道代码接近工作原因是:
我认为这可能是因为我的Items集合没有任何更改通知,因此在初始加载后async调用正在进行时,集合不会更新到屏幕。
有人知道为什么会发生这种情况和/或提供有关修复的建议吗?
非常感谢!
答案 0 :(得分:0)
问题是CollectionViewSource
绑定到Items
集合,并且您要将项目添加到Files
集合
更改您的代码以添加到Items
或将您的XAML更改为指向Files
您可能还需要调用添加操作
答案 1 :(得分:0)
我通过做一些改变让这个工作。
我将Items集合变成了ObservableCollection,然后移动了linq查询并将查询结果添加到异步Construct方法。
这感觉很乱,但它现在有效。谢谢大家!