2010-07-22 92 views
14

我需要在网格中以很高的频率添加很多行(在某些情况下每秒最多可以有10行) 我选择了ListView,因为我认为它是WPF中最快的网格控件。 (肯定比GridView快很多)WPF:将项目添加到ListView的最有效/最快的方式是什么?

在添加了几十万个项目并且它们继续进入之后,CPU利用率变得非常高。这很令人惊讶,因为ListView只呈现可见行,所以它应该没有关系许多都是加在一起的。

我的第一种方法是将其绑定到ObservableCollection,但一段时间后,CPU利用率上升,整个窗口变得紧张起来。

比我试图将它绑定到一个常规列表,看起来更快,但是我确实需要经常调用列表上的.Refresh(),这会在一段时间后猛击CPU。

比我试图subclassing ObservableCollection大块插入希望批处理他们会提高性能/减少cpu工作负载,但这种方法似乎需要调用CollectionView.Refresh这是相同的调用集合上的Reset(),也无法当该系列中有很多项目。

清除observablecollection而不是调用myListView.Items.Refresh()将其重新设置为0会将cpu使用率带回起点。

在这里开始用尽想法..再次,我的目标是添加/显示大量项目并以最高性能的方式显示8列网格。ListView看起来不错,只需要一些

  • (75%)系统:我的方式可能会进一步调整它..

    UPDATE

    分析后,800K的ObservableCollection中的行格,最CPU密集型工作是完成。 Windows.Media.MediaContext.RenderMessa geHandler(对象resizedCompositionTarget)

  • (20%)ObservableCollection.OnCollectionChanged(NotifyCoolectionChanged ..)

尽管取决于会话这些数字变化很大..

UPDATE 2 ..确定的BindingList似乎是这里明确的赢家。

这里有结果(蜱)肩并肩100万行,每行(并增加每秒10项):

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

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

可以查看CPU活动的总体下降情况,以及在“绑定列表”情况下处理树所需的滴答数量的一半!感谢阿卡什这个伟大的想法。

回答

16

而不是使用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 

您可以启用/禁用即使分批更新,而不是在一个镜头中加入了一切,的BindingList已在我所有的UI开始运作好那么的ObservableCollection,我不知道为什么当的BindingList真的superseds无处不在人们更多地谈论的ObservableCollection的ObservableCollection。

+0

Akash,谢谢你。我会尽快测试这个集合。我很好奇的一件事是,如果有一种方法可以批量插入,无需刷新整个列表。我相信这是很多抖动和cpu工作的来源,当800k项目被刷新时等。 – 2010-07-22 13:15:00

+0

我不认为它会刷新800k项目,因为虚拟化面板只会在屏幕上刷新有限的项目。然而,另一种方式是使用某种寻呼机来寻找您的项目,在我的应用程序中,我只会首先加载0-20,并让用户浏览一个接一个,也可以使用某种搜索进行过滤 – 2010-07-22 13:32:11

+2

您是否尝试过滤你的绑定列表?与ObservableCollection,我使用CollectionViewSource,因为它提供了一个过滤器,该过滤器执行每个添加项目。该过滤器可能会在刷新后在所有行上执行。所以我需要找到另一种方法来添加过滤。 – 2010-07-22 14:21:34

相关问题