我正在构建一个应用程序,它使用许多 ItemControls(数据网格和列表视图)。为了从后台线程轻松更新这些列表,我将此扩展用于 ObservableCollections,效果很好:
今天我安装了 VS12(它又安装了 .NET 4.5),因为我想使用一个为 .NET 4.5 编写的组件。在将我的项目升级到 .NET 4.5(从 4.0)之前,我的数据网格在从工作线程更新时开始抛出 InvalidOperationException。异常消息:
引发此异常是因为名称为“(未命名)”的控件“System.Windows.Controls.DataGrid Items.Count:5”的生成器已接收到与 Items 集合的当前状态不一致的 CollectionChanged 事件序列。检测到以下差异:累计计数 4 与实际计数 5 不同。[累计计数为(上次重置时的计数 + #Adds - 自上次重置以来的#Removes)。]
复制代码:
XAML:
<Window x:Class="Test1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid ItemsSource="{Binding Items, Mode=OneTime}" PresentationTraceSources.TraceLevel="High"/>
</Grid>
</Window>
代码:
public partial class MainWindow : Window
{
public ExtendedObservableCollection<int> Items { get; private set; }
public MainWindow()
{
InitializeComponent();
Items = new ExtendedObservableCollection<int>();
DataContext = this;
Loaded += MainWindow_Loaded;
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
foreach (var item in Enumerable.Range(1, 500))
{
Items.Add(item);
}
});
}
}