我发现了问题...我犯了几个错误!
第一个问题:我的属性收藏夹是如何定义的:
public ObservableCollection<FavoriteItemViewModel> Favorites
{
get
{
return _favorites ?? (this.LoadFavorites(App.MainViewModel.Favorites));
}
set
{
_favorites = value;
}
}
get 部分从未实际设置内部变量,因此会一遍又一遍地从 MainViewModel 中保存的收藏夹集合中重新加载数据。
我把它改成:
return _favorites ?? (this.LoadFavorites(App.MainViewModel.Favorites));
到
return _favorites ?? (_favorites = this.LoadFavorites(App.MainViewModel.Favorites));
哇!!
第二个问题:
因此,虽然以下不是直接从我的可观察集合中删除对象
private void DeleteAction(object actionParameter)
{
List<object> selectedFavorites = actionParameter as List<object>;
foreach (FavoriteItemViewModel item in selectedFavorites)
{
FavoriteItemViewModel itemToDelete =
this.Favorites.FirstOrDefault<FavoriteItemViewModel>
(m => m.Description.ToLowerInvariant() == item.Description.ToLowerInvariant());
if (itemToDelete != null)
this.Favorites.Remove(itemToDelete);
}
}
通过CommandParameter 即List 传递的参数actionParameter 是从我的LongListSelector 中选择的对象的列表(用于处理MVVM 的自定义对象)。 This List is directly affected whenever an item is selected or unselected.
我假设这个参数应该是按值传递的,但事实并非如此,实际上是按引用传递的。
这样呼唤
this.Favorites.Remove(itemToDelete)
第二次将其从可观察集合中删除时也不起作用,它还会影响分配了 actionParameter 变量的局部变量 selectedFavorites 列表,我得到典型的错误:
An exception of type 'System.InvalidOperationException' occurred in
mscorlib.ni.dll but was not handled in user code
Additional information: Collection was modified; enumeration
operation may not execute.`
如果我使用for 循环,而我没有收到错误,假设我选择了 2 个项目,第二个我从收藏夹可观察集合中删除第一个项目, selectedFavorites.count 从 2 下降到 1并导致我的for 循环过早完成。
因此,唯一的解决方法是首先基于selectedFavorites 列表构建一个单独的列表,然后简单地使用for each 循环。
最终代码如下所示:
private void DeleteAction(object actionParameter)
{
List<object> selectedFavorites = actionParameter as List<object>;
List<FavoriteItemViewModel> myList = new List<FavoriteItemViewModel>();
Favorites.RemoveAll(a => selectedFavorites.Exists(w => ((FavoriteItemViewModel)w).Description == a.Description));
myList = null;
}
这按预期工作!