ListBox的刷新项时出现异常

时间:2013-07-10 16:56:56

标签: c# wpf exception listbox

我有一个带有ListBoxButton

的WFP应用程序
<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();时会抛出异常:

  

收藏被修改;枚举操作可能无法执行。

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

我知道这不是更新ListBox的最佳方法,但它是更大更旧代码的一部分,我只是想了解这里的错误。

更新

当我将_selected更改为List<int>并设置list.ItemsSource = _selected;时,输出窗口中没有异常也没有警告。但是,当我将_selected设置为'HashSet`时,问题又回来了。

2 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,因为我仍然不明白为什么会发生这种情况以及发生了什么,但我确信自己不应该担心这一点。异常发生在WPF框架内部,可能会在某处发生。我只能看到通过查看输出窗口运行调试器时出现异常:

  

mscorlib.dll中出现'System.InvalidOperationException'类型的第一次机会异常

只有当我抛出异常时才选择中断,然后调试器确实会中断。没有未处理的例外情况。

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

答案 1 :(得分:0)

最好将您自己的列表与Dictionary分开,并在Dictionary更改时复制值。我建议使用ObservableCollection,这样您就不必进行刷新调用。

我发誓我仍然在某处ObservableDictionary拥有我的代码。