我正在开发一个应用程序,它在ListViews和GridViews中显示很多项目,我正在对这些项目进行分组,并使用SemanticZoom控件使导航更容易。这些项目代表歌曲。我的问题是当用户删除列表中的项目时(通过按住项目然后从上下文菜单中选择删除),项目将从数据库中删除,但不会从列表视图或gridview中删除,因此我必须收听CollectionChanged事件,然后重新加载分组并再次将其分配给CollectionViewSource,这感觉不对。
我想知道是否有办法在WinRT中实现这种效果以及如何实现。主要是我希望交互就像WP联系人应用程序,当用户删除一个联系人时,它会被移除而不会重新加载该列表。
谢谢。
答案 0 :(得分:2)
我一直在学习很多关于SemanticZoom的CollectionViewSource,最重要的是如何在不做奇怪的事情的情况下继续更新(通常在示例中被遗忘)视图:
1.-在模型中创建一个类,类似于一个名为GroupedSongs的视图,它具有类别类属性(字符串,类,枚举)和
2.- ObservableCollection<曲>属性为INotifyPropertyChanged
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}"
这是我取得的最佳选择,如果你在群组中添加或删除歌曲,你会看到用户界面刷新。
我已在Windows 10中测试了我正在准备的应用
答案 1 :(得分:0)
所以我通过创建ObservableCollection的ObservableCollection来解决这个问题,例如:ObservableCollection<ObservableCollection<ItemClass>>
当我更新项目(添加或删除项目)时,我只找到包含项目的内部集合并进行更改。用户界面将很好地反映变化。
编辑:只是为了澄清,为了使列表视图或gridview能够显示我从ObservableCollection继承来创建此类的标题:
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);
}
}
初始化类时,T的类型为ObservableCollection:
KeyedList<ObservableCollection<Song>> MySongs = new .....
希望这会对某人有所帮助。