C# Wpf实时数据绑定到Listview
我想将数据(每秒1000条记录,我的意思是每25毫秒25条记录)绑定到listview,并且必须按datetime降序排列 我使用了可观察的集合。当我从源(例如套接字)获取数据时,我通过在可观察集合的零索引处插入模型来添加到集合中C# Wpf实时数据绑定到Listview,c#,wpf,listview,binding,observablecollection,C#,Wpf,Listview,Binding,Observablecollection,我想将数据(每秒1000条记录,我的意思是每25毫秒25条记录)绑定到listview,并且必须按datetime降序排列 我使用了可观察的集合。当我从源(例如套接字)获取数据时,我通过在可观察集合的零索引处插入模型来添加到集合中 observableCollection.Insert(0, model); 它工作正常,但使用的是%30 cpu(英特尔i5)。如果我打开这些窗口10次,我的应用程序就会变慢。我正在使用虚拟化属性。 如果我没有设置listview的itemsource,cpu使
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>
使用listview正确吗
如何提高性能
是否有其他技术可以做到这一点?INotifyCollectionChanged ObservableCollection事件是瓶颈。首先尝试构建结果列表,然后从列表中创建一个ObservableCollection,然后将ObservableCollection分配给控件的ItemsSource。考虑一个假滚动条,只将前100个项目添加到列表框中,但将单独滚动条的最大值和值设置为实际数据大小和位置。这需要更多的代码来保持滚动条和列表框的同步
数据量和更新次数太多,伪造一个长长的列表可能是唯一的解决方案。暂时忽略刷新问题,你真的希望用户在这么多的数据中滚动寻找什么吗?我认为,即使是顶部可见的行也会变化得太快,以至于有人无法“阅读”其中的内容。另一种UI可能是更好的方法吗?例如,将数据写入某种日志文件,并为用户提供搜索对话框。不,用户应该使用Scrolling这很不幸。您可能已经意识到,
observatecollection
和ItemsControl
绑定方法无法处理以这种速度刷新的大量数据。此外,您将在列表的顶部而不是底部插入项目,AFAIK将导致项目控件刷新其所有容器。如果这些是您的UI约束,那么我建议完全放弃items控件和绑定,编写您自己的自定义控件并通过代码隐藏创建视觉效果。