我有一个绑定到ObservableCollection
的ListBox
,其中包含一些项。它们可能是基类或某些继承类的示例。我需要在3秒内更新一次项列表。若要更新集合列表,项提供程序将下载新列表,然后我需要合并新旧列表。新旧列表中的项使用Item.Id
属性关联。问题是如何更新列表框中的项目而不 Flink ,并保持当前选择等。
有两种方法可以做到这一点
1.用list.RemoveAt()
和list.InsertAt()
来替换所有的项目。同样,使用CollectionViewSource.DeferRefresh()
并在更新前保存当前选择并在更新后恢复也很有用。用这种方法我遇到了一些问题,比如工具提示 Flink 等。
1.另一种方法是用新值更新旧项的每个属性。但这有点困难,因为集合中有一些继承的示例。
处理这种情况的正确方法是什么?如何有效地实现实时数据更新(当更新在新示例集合中下载时)?
3条答案
按热度按时间vojdkbi01#
无论你如何实现它,它总是会刷新整个列表框。这不是不同的列表框方法的问题,而是列表框如何绘制列表中的项目。
您可能需要创建列表框的子类,覆盖其onpaint even,并编写更有效的代码,使其无 Flink 。
我已经这样做了在过去的ListView http://www.codeproject.com/Articles/3617/Flicker-free-ListView-in-NET-Part-2使用此代码。
也许这可能有助于开发一个无 Flink 的列表框也。
jqjz2hbq2#
需要限制对PropertyChanged和CollectionChanged的调用次数。
更新属性并检查新值是否==旧值,如果是,则不调用NotifyPropertyChanged
如果不是类匹配,则不要删除插入,因为这是两个UI通知。
只需分配新项。items[4] = newitem。
您是否正在使用虚拟化。
如果该项目未显示,则UI不会刷新。
请看下面。我没有得到任何UI Flink 以外的项目或项目更新。我怀疑你没有正确地利用PropertyChanged。
shstlldc3#
我遇到了同样的问题,我发现我可以像这样使用
BeginUpdate()
和EndUpdate()
方法:它根本没有消除轻弹,但它变得好多了,我的眼睛不疼了。