Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Wpf实时数据绑定到Listview_C#_Wpf_Listview_Binding_Observablecollection - Fatal编程技术网

C# Wpf实时数据绑定到Listview

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使

我想将数据(每秒1000条记录,我的意思是每25毫秒25条记录)绑定到listview,并且必须按datetime降序排列

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

 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控件和绑定,编写您自己的自定义控件并通过代码隐藏创建视觉效果。