我目前在分组的 WP8 应用程序中实现了 LLS(LongListSelector)。我有一个来自 WPToolkit 的上下文菜单。我希望找到如何在不重新分配 LLS 的项目源的情况下从我的 LLS 中删除项目。删除项目后,我想保持在列表中的位置是有道理的。
我现在拥有的是一个保存我所有对象的主列表,它被传递给“GetGroup”函数以返回一个可观察的组集合作为项目源。我现在明白了,简单地从主列表中删除并不会从项目源中删除。因此,我从主列表中删除,并将 ItemSource 转换为 Observable 集合并从中删除。它一直有效,直到特定实例(删除列表中的倒数第二个项目)。然后我得到一个神秘的异常(值超出范围)。但是,通过调试,所有正确的值都被调用和删除,随后出现异常。我怎样才能以正确的方式做到这一点?我做错了什么?我的代码片段如下。
分组:
private ObservableCollection<Model.Cartitem> cartList = new ObservableCollection<Model.allItems>(); // Overall Item list for current instance.
class Group<T> : ObservableCollection<T>, INotifyPropertyChanged
{
public Group(string name, IEnumerable<T> items)
: base(items)
{
this.imagePath = new Uri(name, UriKind.Relative);
}
private String _Title;
private Uri _imagePath;
public string Title
{
get
{
return _Title;
}
set
{
if (_Title != value)
{
_Title = value;
NotifyPropertyChanged("Title");
}
}
}
public Uri imagePath
{
get
{
return _imagePath;
}
set
{
if (_imagePath != value)
{
_imagePath = value;
NotifyPropertyChanged("imagePath");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
// Functions to Handle Group Lists
private ObservableCollection<ITemClass> GetItemList()
{
return allItems;
}
private ObservableCollection<Group<ItemClass>> GetItemGroups()
{
IEnumerable<ItemClass> tempItemList = GetCartList();
return GetItemGroups(tempItemList , c => c.ItemCategory.ID + "|" + c.ItemCategory.Name + "|" + c.ItemCategory.IMPath);
}
private static ObservableCollection<Group<T>> GetItemGroups<T>(IEnumerable<T> itemList, Func<T, string> getKeyFunc)
{
IEnumerable<Group<T>> groupList = from item in itemList
group item by getKeyFunc(item) into g
orderby g.Key
select new Group<T>(g.Key, g);
//return groupList.ToList();
ObservableCollection<Group<T>> t = new ObservableCollection<Group<T>>();
foreach (Group<T> sublist in groupList)
{
t.Add(sublist);
}
return t;
}
我如何处理删除:
this.cartList.Remove(editingCartItem);
ObservableCollection<Group<ItemClass>> t = (ObservableCollection<Group<ItemClass>>)LongListSelectorObj.ItemsSource;
foreach (Group<ItemClass> sublist in t)
{
if(sublist.Contains(editingItem))
sublist.Remove(editingItem);
break;
}
这有点臃肿,因为我最近进行了更改以尝试将所有内容都设为 ObservableCollection,并认为它可以解决我当时的问题。它确实对其他事情有所帮助,但我认为它归结为列表只是不同的。
我想我可以将其更改为直接绑定 ObservableCollection>,但我相信我会失去简单的添加/排序,对吧?
另外,我认为问题可能是因为我试图从两个单独的列表中删除该项目。但是,我只尝试了一个,但我仍然遇到相同的异常问题,我认为这是来自演员表(即能够删除所有内容,直到倒数第二个,然后是最后一个项目)。
非常感谢任何传入的帮助。