【问题标题】:Wpf Realtime DataBinding To ListviewWpf实时数据绑定到Listview
【发布时间】: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 可能是更好的方法吗?例如,将数据写入某种日志文件并为用户提供搜索对话框。
  • 不,用户应该使用滚动
  • 这很不幸。您可能已经意识到ObservableCollectionItemsControl 绑定方法无法以这种速度处理如此大量的数据刷新。此外,您在列表顶部插入项目,而不是底部,AFAIK 将导致项目控件刷新其容器的 all。如果这些是您的 UI 约束,那么我建议您完全放弃项目控件和绑定,编写您自己的自定义控件并通过代码隐藏创建视觉效果。

标签: c# wpf listview binding observablecollection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2010-11-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2011-01-23
      相关资源
      最近更新 更多