【问题标题】:ObservableCollection clears very slowObservableCollection 清除速度很慢
【发布时间】:2015-07-10 11:08:26
【问题描述】:

我有 ObservableCollection<MyClass> 实例,其中包含 20 个元素,并将其设置为 ItemsSource 用于控件。当我尝试为此集合调用 Clear() 时,它变得干净,但在冻结应用程序 4-5 秒后。如果我不将它用作依赖属性的值,它会很快清除。当我简单地运行(Visual Studio 中的 Ctrl+F5) 应用程序而不是调试时,它也不需要任何时间。

在使用 ObservableCollection 时从未遇到过如此缓慢的情况,并且不知道如何解决此问题(甚至 在分析时 延迟未显示)。我使用 ItemsSource 属性开发控件,因此我无法取消分配属性值 - 清除集合 - 再次设置属性值。我的自定义控件的处理程序工作得很快。并且应用程序在 Clear() 调用之后和我的自定义 INotifyCollectionChanged.CollectionChanged 事件处理程序调用之前冻结。

【问题讨论】:

  • 如果将 ItemsSource 设置为空的 ObservableCollection 而不是 Clear,会发生什么?如果它更快,那么它可能是您的 CollectionChanged 处理程序,如果不是,那么可能是因为您的 MyClass VM 层的 View 层非常重。您最好的办法是给我们一些简单的工作示例,以便我们进行测试
  • @nkoniishvt,通过从标准控件中窃取的优化修复了这个问题,这些控件与 ObservableCollection 一起工作得很快,现在它工作得很快。查看答案。

标签: c# wpf observablecollection


【解决方案1】:

好吧,在制作自己的数据网格时,我建议每个人检查标准 wpf 控件以及它们如何使用 enumarables 进行管理。 在我的项目中,为我的自定义网格创建单元格时,我做了一些这样的操作来将集合元素设置为 DataContext 单元格:

cellContainer.SetBinding(Grid.DataContextProperty, new Binding
{
    Path = new PropertyPath(string.Format("ItemsSource[{0}]", rowIndex)),
    ElementName = "myUserControl"
});

它是无用的绑定,它使 WPF 跟踪每个单元格的集合更改,并且花费大量时间。最好简单地将项目值分配给单元格容器的DataContext,例如:

cellContainer.DataContext = myUserControlInstance.ItemsSource
    /*.OfType<object>.Skip(rowIndex).FirstOrDefault() or for ILists:*/[rowIndex];

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2016-05-19
    • 2016-12-18
    • 2016-08-11
    • 2018-07-19
    相关资源
    最近更新 更多