WPF:将项目添加到ListView的最有效/最快的方法是什么?

Son*_*oul 17 wpf performance

我需要以相当高的频率添加网格中的大量行(在某些情况下每秒最多10行)我选择了ListView,因为我认为它是WPF中最快的网格控件.(当然比GridView快很多)

CPU利用率得到相当高的后添加夫妇十万的项目和他们继续进来,这是相当令人惊讶的,因为呈现的ListView只可见行,所以它不应该不管有多少总共相加.

我的第一种方法是将它绑定到ObservableCollection但过了一会儿,CPU利用率上升,整个Window变得紧张.

比我尝试将它绑定到常规列表,这看起来更快,但我确实需要经常调用列表上的.Refresh(),这一段时间也会扼杀CPU.

比我试图继承的ObservableCollection,以块插片希望他们分批将提高性能/降低CPU的工作负荷,但这种做法似乎需要调用CollectionView.Refresh这是一样的呼吁收集复位(),并且当有很多ineficient集合中的项目.

清除observablecollection并调用myListView.Items.Refresh()将其恢复为0会将cpu使用带回到起始点.

开始的想法跑这里来了这里..同样,我的目的,是增加/显示大量的项目和显示8柱网,在最高效的方式..的ListView似乎不错,那里只是有一些方法我可以进一步调整它..

UPDATE

在分析后,ObservableCollection在网格中有800k行,最多的cpu工作是通过以下方式完成的:

  • (75%)System.Windows.Media.MediaContext.RenderMessageHandler(object resizedCompositionTarget)
  • (20%)ObservableCollection.OnCollectionChanged(NotifyCoolectionChanged ..)

虽然取决于会话,这些数字差异很大..

更新2 ..确定BindingList似乎是明显的赢家.

这里是结果(以刻度表示)并排,每行100万行(每秒添加10个项目):

ObservableCollection:http: //i.imgur.com/7ZoSv.png

BindingList http://i.imgur.com/jm5qF.png

你可以看到CPU活动的整体下降,以及在Binding List案例中处理树所需的大约一半的滴答!感谢Akash这个好主意.

Aka*_*ava 19

而不是使用ObservableCollection我会建议BindingList类,你可以做这样的事情..

BindingList<string> list = new BindingList<string>();

list.AllowEdit = true;
list.AllowNew = true;
list.AllowRemove = true;

// set the list as items source
itemCollection.ItemsSource = list;

// add many items...

// disable UI updation
list.RaiseListChangedEvents = false;

for each(string s in MyCollection){
   list.Add(s);
}

// after all.. update the UI with following
list.RaiseListChangedEvents = true;
list.ResetBindings(); // this forces update of entire list
Run Code Online (Sandbox Code Playgroud)

您甚至可以批量启用/禁用更新,而不是一次性添加所有内容,BindingList在我的所有UI中的功能都比ObservableCollection更好,我想知道为什么当BindingList真正取代ObservableCollection时,每个人都会更多地谈论ObservableCollection.

  • 你试过过滤你的绑定列表吗?使用ObservableCollection,我使用的是CollectionViewSource,因为它提供了一个过滤器,该过滤器在每个添加的项目上执行.该过滤器是刷新后可能在所有行上执行的过滤器.所以我需要找到另一种添加过滤的方法. (2认同)