【发布时间】:2015-04-12 00:38:26
【问题描述】:
我想将数据(每秒 1000 条记录,我的意思是每 25 毫秒 25 条记录)绑定到列表视图,并且必须按日期时间降序排列。
我使用了可观察的集合。当我从源(例如套接字)获取数据时,我通过在可观察集合的零索引处插入模型来添加到我的集合中。
observableCollection.Insert(0, model);
它工作没问题,但它使用 %30 cpu (intel 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>
使用listview是否正确?
如何提高性能?
还有其他技术可以做到这一点吗?
【问题讨论】:
-
暂时忽略刷新问题,您真的希望用户滚动浏览这么多数据以查找内容吗?我认为即使是顶部可见的行也会变化得太快,以至于有人无法“阅读”其中的内容。替代 UI 可能是更好的方法吗?例如,将数据写入某种日志文件并为用户提供搜索对话框。
-
不,用户应该使用滚动
-
这很不幸。您可能已经意识到
ObservableCollection和ItemsControl绑定方法无法以这种速度处理如此大量的数据刷新。此外,您在列表顶部插入项目,而不是底部,AFAIK 将导致项目控件刷新其容器的 all。如果这些是您的 UI 约束,那么我建议您完全放弃项目控件和绑定,编写您自己的自定义控件并通过代码隐藏创建视觉效果。
标签: c# wpf listview binding observablecollection