c# - 刷新列表框项目时出现异常

标签 c# wpf exception listbox

我有一个带有 ListBox 的 WFP 应用程序和一个 Button :

<Window x:Class="UITester.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
    Title="MainWindow" Height="350" Width="525">
        <ListBox Name="list"></ListBox>
        <Button Click="ButtonSelect_OnClick">Select Stuff</Button>
</Window>

在后面的代码中我有这个:

public partial class MainWindow : Window
{
    private readonly Dictionary<int, int> _selected = new Dictionary<int, int>();

    public MainWindow()
    {
        InitializeComponent();

        list.ItemsSource = _selected.Values;
    }

    private void ButtonSelect_OnClick(object sender, RoutedEventArgs e)
    {
        _selected.Clear();
        for (int i = 0; i < 4; ++i)
        {
            _selected.Add(i, i);                
        }

        list.Items.Refresh();
    }
}

如果我在没有附加调试器的情况下运行应用程序,一切似乎都正常 - 我单击按钮,列表中出现数字 0 到 3。

但是,如果我在附加调试器的情况下运行它,我会在调用 list.Items.Refresh(); 行时看到抛出异常:

Collection was modified; enumeration operation may not execute.

据我所知,在枚举集合的同时尝试更改集合时会抛出此异常。但我很确定情况并非如此。这里的一切都发生在 UI 线程中。首先,我将元素添加到字典中,只有在完成后,我才会刷新列表框中的项目。在我看来,什么都没有改变,事实上,什么也没有被列举。 我想 Refresh方法枚举字典的值,但它们已经更新,并且在此枚举期间不会更改。

我知道这不是更新 ListBox 的最佳方式,但它是更大更旧代码的一部分,我只想了解这里出了什么问题。

更新

当我改变 _selected成为List<int>并设置 list.ItemsSource = _selected;然后在输出窗口中没有异常并且没有警告。但是当我设置 _selected成为 'HashSet` 然后问题又回来了。

最佳答案

这不是一个完整的答案,因为我仍然不明白为什么会发生这种情况以及幕后发生了什么,但我已经说服自己我不应该为此担心。异常发生在 WPF 框架的深处,可能在某处被捕获。通过查看输出窗口,我只能在使用调试器运行时看到异常:

A first chance exception of type 'System.InvalidOperationException' occurred in mscorlib.dll

只有当我选择在抛出异常时中断,调试器才会真正中断。没有未处理的异常。

所以虽然真正的原因仍然是个谜,但问题似乎不在我的代码中......

关于c# - 刷新列表框项目时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576538/

相关文章:

c# - 将图像存储在文件夹中并使用 Mysql 数据库在 C# 应用程序中检索

c# - 返回对象时如何抛出异常?

java - 在 Java 中使用 .hasNextInt() 进行一些简单的异常处理有问题吗?

java - 使用 try 和 catch 检查条件 block-java

c# - 两个或多个对象具有相同的目标位置 '<location>'

c# - 如何下载 HTTPS 网页的内容?

c# - 使用 Frame 和 Combobox MVVM 进行导航

wpf - 设置 GridView 列的样式

c# - 如何检索 MVC 页面上所有输入的所有值

wpf - 从子usercontrol datagrid行动态加载父用户控件表单