WPF ListView: Zmiana ItemsSource nie zmienia ListView

UżywamListView kontrola wyświetlania niektórych linii danych. Istnieje zadanie w tle, które otrzymuje zewnętrzne aktualizacje zawartości listy. Nowo otrzymane dane mogą zawierać mniej, więcej lub tę samą liczbę elementów, a także same elementy mogły ulec zmianie.

TheListView.ItemsSource jest związany zOberservableCollection (_itemList), aby zmiany w _itemList były widoczne również wListView.

_itemList = new ObservableCollection<PmemCombItem>();
_itemList.CollectionChanged += new NotifyCollectionChangedEventHandler(OnCollectionChanged);
L_PmemCombList.ItemsSource = _itemList;

Aby uniknąć odświeżania kompletnego ListView, wykonuję proste porównanie nowo pobranej listy z bieżącą listą _itemList, zmieniam elementy, które nie są takie same, i dodam / usuwam elementy, jeśli to konieczne. Kolekcja „newList” zawiera nowo utworzone obiekty, więc zastąpienie elementu w _itemList poprawnie wysyła powiadomienie „Odśwież” (które mogę zalogować za pomocą modułu obsługi zdarzeń)OnCollectionChanged z ObservableCollection`)

Action action = () =>
{
    for (int i = 0; i < newList.Count; i++)
    {
        // item exists in old list -> replace if changed
        if (i < _itemList.Count)
        {
            if (!_itemList[i].SameDataAs(newList[i]))
                _itemList[i] = newList[i];
        }
        // new list contains more items -> add items
        else
            _itemList.Add(newList[i]);
     }
     // new list contains less items -> remove items
     for (int i = _itemList.Count - 1; i >= newList.Count; i--)
         _itemList.RemoveAt(i);
 };
 Dispatcher.BeginInvoke(DispatcherPriority.Background, action);

Moim problemem jest to, że jeśli wiele elementów zostanie zmienionych w tej pętli, toListView NIE jest odświeżany, a dane na ekranie pozostają takie, jakie są ... i tego nie rozumiem.

Nawet taka prostsza wersja (wymiana WSZYSTKICH elementów)

List<PmemCombItem> newList = new List<PmemCombItem>();
foreach (PmemViewItem comb in combList)
    newList.Add(new PmemCombItem(comb));

if (_itemList.Count == newList.Count)
    for (int i = 0; i < newList.Count; i++)
        _itemList[i] = newList[i];
else
{
    _itemList.Clear();
    foreach (PmemCombItem item in newList)
        _itemList.Add(item);
}

nie działa poprawnie

Jakieś wskazówki na ten temat?

AKTUALIZACJA

Jeśli po zaktualizowaniu wszystkich elementów wywołam następujący kod, wszystko działa prawidłowo

OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));

Ale oczywiście powoduje to, że interfejs użytkownika aktualizuje wszystko, czego wciąż chcę uniknąć.

questionAnswers(5)

yourAnswerToTheQuestion