集合已被修改;枚举操作可能无法执行。

3

当我试图使用MVVM框架关闭我们的Silverlight应用程序中的视图时,出现以下错误:

集合已修改;枚举操作可能无法执行。

这是我的代码:

ObservableCollection<IViewModel> _viewModels = new ObservableCollection<IViewModel>();

        var _viewManager = AppContext.Current.ViewService.GetViewManager("Main");
        var _views = _viewManager.OpenViews;

        _viewModels = _views;

        foreach (var _vm in _viewModels)
        {
            _viewManager.CloseView(_vm);
        }
3个回答

7

使用 foreach 迭代的集合是无法进行修改的。

CloseView(_vm) 似乎会从 ObservableCollection 中删除一个元素。


4

虽然Marius Schulz是完全正确的,但简单的解决方案是创建一个新集合来删除你希望删除的数据,或者使用for(;;)循环代替foreach。

// using Linq's ToArray() to create a new collection
foreach (var _vm in _viewModels.ToArray()) 
{
    _viewManager.CloseView(_vm);
}

感谢您的帮助,我同意不使用foreach的前提条件 - 我正在通过使用for循环来解决问题。这似乎是正确的方法。 - gevjen
注意for循环。如果在迭代时从集合中删除某些条目,可能会导致跳过一些条目。 - svick
使用for循环时,最好从集合的末尾开始循环。尽管在这种情况下我不建议这样做,因为你正在让viewManager执行删除操作,而无法假设顺序与循环中的顺序相同。但如果你确信是这样的话,那就不应该有问题。 - aqwert
1
@svick:这就是调用 ToArray() 的全部意义,确保我们不会直接(或间接地)遍历实际集合。使用它会将元素复制到一个单独的集合中,该集合本身不会被修改。 - Jeff Mercado

0
使用了一个for循环 -
var viewManager = AppContext.Current.ViewService.GetViewManager("Main");
var views = viewManager.OpenViews;

for (int i = views.Count -1; i < views.Count; i--)
{
    if(i == -1)
    {
        return;
    }
    viewManager.CloseView(_views[i]);
}

通过我的视图计数向后工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接