多くの ItemControls (データグリッドとリストビュー) を使用するアプリケーションを構築しています。バックグラウンド スレッドからこれらのリストを簡単に更新するために、この拡張機能を ObservableCollections に使用しました。
今日、.NET 4.5用に作成されたコンポーネントを使用したいので、VS12をインストールしました(.NET 4.5をインストールしました)。プロジェクトを (4.0 から) .NET 4.5 にアップグレードする前に、データグリッドがワーカースレッドから更新されたときに InvalidOperationException をスローし始めました。例外メッセージ:
この例外は、名前が '(unnamed)' のコントロール 'System.Windows.Controls.DataGrid Items.Count:5' のジェネレーターが、Items コレクションの現在の状態と一致しない一連の CollectionChanged イベントを受け取ったため、スローされました。次の違いが検出されました: 累積カウント 4 は実際のカウント 5 とは異なります。
再現コード:
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);
}
});
}
}