2015-02-11 71 views
2

我想绑定数据(每秒1000条记录,我的意思是每25毫秒25条记录)到一个列表视图,它必须按日期时间降序排列。Wpf实时数据绑定到列表视图

我已经使用了observable集合。当我从源(例如套接字)获取数据时,我通过将模型插入可观察集合的零索引来添加到我的集合中。

observableCollection.Insert(0, model); 

它工作没问题,但它使用%30 cpu(英特尔i5)。如果我打开这些窗口10次,我的应用程序变得越来越慢。我正在使用虚拟化属性。 如果我不设置listview的itemsource,cpu使用率大约为0。

这是我的列表视图:

<ListView HorizontalAlignment="Stretch" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" Name="listView" ScrollViewer.CanContentScroll="True" Grid.Column="0" VerticalAlignment="Stretch" ItemsSource="{Binding observableCollection}"> 
    <ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VirtualizingStackPanel></VirtualizingStackPanel> 
    </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    <ListView.View> 

    <GridView> 
     <GridViewColumn DisplayMemberBinding="{Binding ID}" Width="75" Header="Id" /> 
     <GridViewColumn DisplayMemberBinding="{Binding Time}" Width="175" Header="Time" /> 
     <!-- Ten more columns --> 
    </GridView> 
    </ListView.View> 
</ListView> 

是否正确使用列表视图?

我该如何提高性能?

有没有其他技术可以做到这一点?

+2

暂时忽略刷新问题,你真的希望用户滚动浏览那么多的数据寻找什么?我会争辩说,即使是顶部的可见行也会变得太快,以至于无法“阅读”其中的内容。可能一个替代用户界面是一个更好的方法?例如,将数据写入某种日志文件并为用户提供搜索对话框。 – 2015-02-11 15:45:16

+0

不,用户应该使用滚动 – 2015-02-11 16:42:57

+0

这很不幸。你可能已经意识到'ObservableCollection'和'ItemsControl'绑定方法将无法应对以这种速度刷新数据量。您也可以将项目插入列表顶部,而不是底部,AFAIK将使项目控件刷新所有*容器。如果这些是你的UI约束,那么我会建议完全放弃项目控件和绑定,编写自己的自定义控件并通过代码隐藏创建视觉效果。 – 2015-02-11 16:51:16

回答

0

ObservableCollection的INotifyCollectionChanged事件是瓶颈。尝试先建立结果列表,然后从列表创建ObservableCollection,然后将ObservableCollection分配给控件的ItemsSource。

0

考虑一个虚假的滚动条,只需将前100个项目添加到列表框中,但将单独滚动条的最大值和值设置为实际数据大小和位置。这需要更多的代码来保持滚动条和列表框的同步。

数据量和更新次数太多,假装长列表可能是唯一的解决方案。