我想将数据(每秒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是否正确?
如何提高表现?
还有其他技术吗?
答案 0 :(得分:0)
ObservableCollection的INotifyCollectionChanged事件是瓶颈。首先尝试构建结果列表,然后从列表中创建一个ObservableCollection,然后将ObservableCollection分配给控件的ItemsSource。
答案 1 :(得分:0)
通过仅将前100个项目添加到列表框但将单独滚动条的最大值和值设置为实际数据大小和位置来考虑假滚动条。这需要更多代码来保持滚动条和列表框同步。
数据量和更新次数太多,伪造一个长列表可能是唯一的解决方案。