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 :))