更新分组列表视图
Updating grouped listview
我正在开发一个在 ListViews 和 GridViews 中显示大量项目的应用程序,我正在对这些项目进行分组并使用 SemanticZoom 控件来简化导航。这些项目代表歌曲。我的问题是当用户删除列表中的项目时(通过按住项目然后从上下文菜单中选择删除)项目从数据库中删除但不是从列表视图或网格视图中删除所以我必须听CollectionChanged 事件,然后重新加载分组并再次将其分配给 CollectionViewSource,这感觉不对。
我想知道在WinRT中有没有办法实现这种效果,如何实现。主要是我希望交互就像 WP 联系人应用程序一样,当用户删除联系人时,它会被删除而无需应用程序重新加载列表。
谢谢。
我学习了很多关于 SemanticZoom 和 CollectionViewSource 的知识,最重要的是如何在不做奇怪事情的情况下不断更新(通常在示例中被遗忘)视图:
1.- 在模型中创建一个 class,类似于名为 GroupedSongs 的视图,其类别为 class 属性(字符串,class,枚举)和
2.- 具有 INotifyPropertyChanged
的 ObservableCollection属性
3.- 在您的 ViewModel 中创建一个名为 Groups 的 ObservableCollection。 (永不重置,一审后始终清除)
4.- 读取内容并填充 Groups ObservableCollection
5.- 在 XAML 中添加以下资源:
<CollectionViewSource x:Name="CVS" ItemsPath="Songs" IsSourceGrouped="True" Source="{Binding Groups}"/>
6.- 在语义放大视图中:
<ListView x:Name="ZoomedInView" ItemsSource="{Binding Source={StaticResource CVS}}"
7.- 在语义缩小视图中
<GridView ItemsSource="{Binding Groups}"
这是我实现的最佳选择,如果您从组中添加或删除歌曲,您会看到 UI 刷新。
我已经在 Windows 10 中测试了我正在准备的应用程序
所以我通过创建 ObservableCollections 的 ObservableCollection 解决了这个问题,例如:ObservableCollection<ObservableCollection<ItemClass>>
当我更新项目(添加或删除项目)时,我只是找到包含该项目的内部 collection 并进行更改。 UI 将很好地反映更改。
编辑:澄清一下,为了使 listview 或 gridview 能够显示 headers 我从 ObservableCollection 继承来创建这个 class:
public class KeyedList<T> : ObservableCollection<T>
{
public object Key
{ get; set; }
public KeyedList()
{ }
public KeyedList(IGrouping<object, T> group)
{
Key = group.Key;
foreach (var member in group)
Add(member);
}
}
当我初始化 class 时,T 将是 ObservableCollection 类型:
KeyedList<ObservableCollection<Song>> MySongs = new .....
希望这会对某人有所帮助。
我正在开发一个在 ListViews 和 GridViews 中显示大量项目的应用程序,我正在对这些项目进行分组并使用 SemanticZoom 控件来简化导航。这些项目代表歌曲。我的问题是当用户删除列表中的项目时(通过按住项目然后从上下文菜单中选择删除)项目从数据库中删除但不是从列表视图或网格视图中删除所以我必须听CollectionChanged 事件,然后重新加载分组并再次将其分配给 CollectionViewSource,这感觉不对。
我想知道在WinRT中有没有办法实现这种效果,如何实现。主要是我希望交互就像 WP 联系人应用程序一样,当用户删除联系人时,它会被删除而无需应用程序重新加载列表。
谢谢。
我学习了很多关于 SemanticZoom 和 CollectionViewSource 的知识,最重要的是如何在不做奇怪事情的情况下不断更新(通常在示例中被遗忘)视图:
1.- 在模型中创建一个 class,类似于名为 GroupedSongs 的视图,其类别为 class 属性(字符串,class,枚举)和
2.- 具有 INotifyPropertyChanged
的 ObservableCollection3.- 在您的 ViewModel 中创建一个名为 Groups 的 ObservableCollection。 (永不重置,一审后始终清除)
4.- 读取内容并填充 Groups ObservableCollection
5.- 在 XAML 中添加以下资源:
<CollectionViewSource x:Name="CVS" ItemsPath="Songs" IsSourceGrouped="True" Source="{Binding Groups}"/>
6.- 在语义放大视图中:
<ListView x:Name="ZoomedInView" ItemsSource="{Binding Source={StaticResource CVS}}"
7.- 在语义缩小视图中
<GridView ItemsSource="{Binding Groups}"
这是我实现的最佳选择,如果您从组中添加或删除歌曲,您会看到 UI 刷新。
我已经在 Windows 10 中测试了我正在准备的应用程序
所以我通过创建 ObservableCollections 的 ObservableCollection 解决了这个问题,例如:ObservableCollection<ObservableCollection<ItemClass>>
当我更新项目(添加或删除项目)时,我只是找到包含该项目的内部 collection 并进行更改。 UI 将很好地反映更改。
编辑:澄清一下,为了使 listview 或 gridview 能够显示 headers 我从 ObservableCollection 继承来创建这个 class:
public class KeyedList<T> : ObservableCollection<T>
{
public object Key
{ get; set; }
public KeyedList()
{ }
public KeyedList(IGrouping<object, T> group)
{
Key = group.Key;
foreach (var member in group)
Add(member);
}
}
当我初始化 class 时,T 将是 ObservableCollection 类型:
KeyedList<ObservableCollection<Song>> MySongs = new .....
希望这会对某人有所帮助。