Я создаю приложение, которое использует много ItemControls (datagrids и listviews). Чтобы легко обновить эти списки из фоновых потоков, я использовал это расширение для ObservableCollections, которое отлично работало:
Сегодня я установил VS12 (который, в свою очередь, установил .NET 4.5), поскольку я хочу использовать компонент, написанный для .NET 4.5. Прежде чем даже обновить мой проект до .NET 4.5 (начиная с версии 4.0), мой datagrid начал бросать InvalidOperationException при обновлении из workthread. Сообщение об исключении:
Это исключение было выбрано потому, что генератор для управления "System.Windows.Controls.DataGrid Items.Count: 5" с именем "(неназванный)" получил последовательность событий CollectionChanged, которые не согласуются с текущим состоянием элементов коллекция. Были обнаружены следующие отличия: Накопленный счет 4 отличается от фактического счета 5. [Накопленный счет (счетчик Reset + #Adds - #Removes с последнего Reset).]
Код репрограммы:
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);
}
});
}
}