You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms中集合修改导致枚举操作无法执行问题求助

解决Xamarin Forms中"Collection was modified; enumeration operation may not execute."异常

这个错误我太熟了!本质就是集合正在被枚举(比如ListView正忙着渲染它的列表项)的时候,你又修改了集合的内容(增删元素或者改变集合结构),CLR不允许这种操作,因为会导致枚举结果不一致,直接抛出这个异常。结合你给出的ListView代码,我给你几个针对性的解决思路:

1. 替换数据源为支持通知且线程安全的集合类型

如果你现在用的是普通的List<T>作为ListView的ItemsSource,赶紧换成ObservableCollection<T>——它实现了INotifyCollectionChanged接口,能自动通知UI更新列表。但要注意:ObservableCollection<T>本身不是线程安全的,如果有后台线程需要修改这个集合,必须切换到UI线程执行操作,比如用Device.BeginInvokeOnMainThread包裹修改逻辑。

如果你的项目有频繁的后台线程更新集合的场景,可以自己实现一个ConcurrentObservableCollection,或者使用第三方库中现成的线程安全集合类型。

2. 排查ExerciseName_Focused事件中的操作

你在Entry的Focused事件里很可能做了修改数据源集合的操作(比如增删项、调整集合结构),这是触发这个异常的高频场景。

举个错误示例(直接在事件里修改集合):

private void ExerciseName_Focused(object sender, FocusEventArgs e)
{
    var entry = sender as Entry;
    var item = entry.BindingContext as ExerciseModel;
    // 直接修改绑定的集合,此时ListView可能正在枚举这个集合,触发异常
    _exerciseCollection.Remove(item);
}

改成正确的方式(切换到UI线程,避免枚举冲突):

private void ExerciseName_Focused(object sender, FocusEventArgs e)
{
    // 确保修改操作在UI线程执行,并且延迟执行避免和当前枚举操作冲突
    Device.BeginInvokeOnMainThread(async () => {
        await Task.Delay(50); // 短暂延迟,确保ListView当前的枚举操作完成
        var entry = sender as Entry;
        var item = entry.BindingContext as ExerciseModel;
        if(_exerciseCollection.Contains(item))
        {
            _exerciseCollection.Remove(item);
        }
    });
}

3. 避免在枚举集合的过程中直接修改它

如果有遍历集合的代码(比如foreach循环),绝对不要在循环里直接增删元素。正确的做法是先把要修改的元素收集到一个临时列表里,遍历完成后再批量修改:

// 错误做法:遍历中直接修改集合
foreach(var item in _exerciseCollection)
{
    if(item.IsInvalid) _exerciseCollection.Remove(item);
}

// 正确做法:先收集要修改的项,再批量处理
var invalidItems = _exerciseCollection.Where(item => item.IsInvalid).ToList();
foreach(var item in invalidItems)
{
    _exerciseCollection.Remove(item);
}

4. 规范ListView的绑定方式

尽量通过MVVM模式绑定ItemsSource,把集合放在ViewModel中,所有对集合的修改都通过ViewModel来执行,并且确保修改操作在UI线程(如果是后台线程触发的更新)。这样能避免直接操作UI控件的ItemsSource导致的枚举冲突。


内容的提问来源于stack exchange,提问作者Subash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:56:18