WPF ListView:更改ItemsSource不会更改ListView

我使用ListView控件来显示一些数据行。 有一个后台任务接收列表内容的外部更新。 新接收的数据可能包含更少,更多或相同数量的项目,并且项目本身也可能已更改。

ListView.ItemsSource绑定到OberservableCollection(_itemList),因此对于_itemList的更改也应该在ListView可见。

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

为了避免刷新完整的ListView,我将新检索的列表与当前_itemList进行简单比较,更改不相同的项目,并在必要时添加/删除项目。 集合“newList”包含新创建的对象,因此替换_itemList中的项正确发送“刷新”通知(我可以使用ObservableCollection的事件处理程序OnCollectionChanged进行记录)

 Action action = () => { for (int i = 0; i  replace if changed if (i  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); 

我的问题是,如果在这个循环中更改了许多项目, ListView不会刷新,屏幕上的数据保持不变……这我不明白。

甚至更简单的版本(交换所有元素)

 List newList = new List(); 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); } 

工作不正常

这有什么线索吗?

UPDATE

如果我在更新所有元素后手动调用以下代码,一切正常

 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 

但当然这会导致UI更新我仍想避免的所有内容。

这是我必须做的才能让它发挥作用。

 MyListView.ItemsSource = null; MyListView.ItemsSource = MyDataSource; 

更改后,您可以使用以下内容刷新Listview,这样更容易

 listView.Items.Refresh(); 

每次可观察集合发生更改时,都不应重置ListView ItemsSource 。 只需设置适当的绑定即可。 在xaml

  

并且在代码隐藏(建议使用MVVM )属性中负责保存_itemList

 public ObservableCollection ItemsCollection { get { if (_itemList == null) { _itemList = new ObservableCollection(); } return _itemList; } } 

更新:有类似的post,很可能会回答你的问题: 如何通过工作线程更新ObservableCollection?

我找到了办法。 它并不是那么好但它有效。

 YourList.ItemsSource = null; // Update the List containing your elements (lets call it x) YourList.ItemsSource = x; 

这应该刷新你的ListView (它适用于我的UAP :))