我有一个带有 aListBox
和 a的 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();
会引发异常:
收藏已修改;枚举操作可能无法执行。
据我所知,在枚举集合时尝试更改集合时会引发此异常。但我很确定情况并非如此。这里的一切都发生在 UI 线程中。首先,我将元素添加到字典中,只有在完成后,我才会刷新列表框中的项目。在我看来,什么都没有改变,事实上,什么都没有列举。我想该Refresh
方法枚举字典的值,但它们已经更新并且在此枚举期间没有更改。
我知道这不是更新 a 的最佳方式ListBox
,但它是更大更旧代码的一部分,我只想了解这里出了什么问题。
更新
当我更改_selected
为List<int>
并设置list.ItemsSource = _selected;
时,输出窗口中没有异常和警告。但是当我设置_selected
为“HashSet”时,问题又回来了。