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ąć.