【问题标题】:Loading data to datagrid takes too much time将数据加载到数据网格需要太多时间
【发布时间】:2016-03-05 08:00:41
【问题描述】:

我的 WPF 应用程序中有一个 DataGrid 控件。它绑定到模型对象的 ObservableCollection。每个 Model 对象都有一个构造函数,它将 EF-Model 对象用作参数。应用用户输入正确的凭据后,有一个方法,应该执行。此方法从 DB(大约 1000 个 EF-Model 对象)异步加载数据。加载后,我将每个对象传递给模型构造函数(类似MyEFModelObjectsCollection.ForEach(o => MyObservableCollection.Add(new Model(o))))。但是将这千个对象加载到我的 DataGrid 中需要很长时间。我该如何处理?

【问题讨论】:

  • 您可以尝试创建一个 ObervableCollection 并在构造函数中传入模型。然后将这个新的 ObervableCollection 设置为 DataGrid 的 ItemsSource
  • DataGrid 很慢。可以用 ListView / GridView 吗?
  • @Frisbee,看来,你是对的。在我向 ObservableCollection (AddRange()) 添加新方法后,我仍然花了太多时间来加载数据,但在将我的集合绑定到列表视图后,问题已经解决。你能解释一下,为什么 datagrid 需要这么多时间来加载数据吗?
  • 我通常使用 Elisium.extra nuget 包作为我的 wpf 应用程序的界面。它有相当漂亮的数据网格。我觉得它非常有用,但它并不烦我,因为它太慢了。

标签: c# wpf entity-framework asynchronous datagrid


【解决方案1】:

除非您需要编辑,否则请使用 ListView / GridView
如果你只需要基本的编辑(文本框)仍然使用 ListView

DataGrid 做了很多工作,但它带来了很多开销
数据模型本身就很复杂

【讨论】:

    【解决方案2】:

    可能的原因是 ObservableCollection.Add() 方法每次都会生成事件 CollectionChanged。因此,它会影响您的应用程序的性能。 此外,ObserverCollection 不包含方法 AddRange()。但是您可以添加自己的 ObservableCollectionEx:ObservableCollection 并实现 AddRange(IEnumerable collection) 方法。您可以找到很多示例。

    【讨论】:

    • 我已经实现了 AddRange(),但没有帮助。我还删除了异步执行,但它仍然不起作用。由于我已经更改了所有内容,因此我可以看到抛出 ContextDeadlock 异常。我真的很沮丧。
    【解决方案3】:

    在这种类型的场景中实现更好的用户体验的一个好方法是为每一行设置一个包装 ViewModel。创建 1000 个包装器并将您的网格绑定到这些新 ViewModel 的集合。在 DataGrid Columns XAML 上,使用绑定中的 FallBack 值来显示临时值。然后,当您的异步数据服务返回您的 Model 对象时,将每个对象传递给包装 ViewModel 并使用新值更新 ViewModel 的属性,以便网格始终响应,并逐渐显示正确的数据。

    【讨论】:

    • 这很有趣。你能提供一个小例子或链接吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 2013-09-18
    • 2018-11-28
    • 2019-01-28
    • 2011-06-03
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多