【问题标题】:UI freezing when altering ObservableCollection/CollectionViewSource更改 ObservableCollection/CollectionViewSource 时 UI 冻结
【发布时间】:2013-09-14 15:09:54
【问题描述】:

我有一个数据网格正在接收 100,000+ 行的更新,该更新绑定到 CollectionViewSource.View,其源是 ObservableCollection。如果我尝试在当前设置中更新,当我将新行添加到 ObservableCollection 时,UI 会完全冻结。为了解决这个问题,我在将行添加到 ObservableCollection 之前设置了 CollectionViewSource.Source = null,这样它就可以正常工作。唯一的问题是,一旦我为第一次加载执行此操作,下一次加载仍然会出现 UI 冻结问题。 这是代码。

public CollectionViewSource ViewSource { get; set; }
private ObservableCollection<ScreenerRow> internalRows = new ObservableCollection<ScreenerRow>();


private async Task Search()
{
    internalRows.Clear();
    ViewSource.Source = null;
    var data = await Task.Run(() =>
    {
        return DoStuff();
    });
    if (data == null) return;
    foreach (ScreenerRow sRow in data)
    {
        //freezes in here on second run
        internalRows.Add(sRow);
    }
    ViewSource.Source = internalRows;
}

只是想知道是否有其他人遇到过这个问题,或者看到我这样做的方式有问题。 感谢您的帮助。

编辑:将我的 ObservableCollection 更改为 List 可以正常工作。

//private ObservableCollection<ScreenerRow> internalRows = new ObservableCollection<ScreenerRow>();
private List<ScreenerRow> internalRows = new List<ScreenerRow>();

【问题讨论】:

  • 您实际上并没有一次显示 100k+ 个项目,是吗?另外,正如我一直说的,CollectionViewSource 是为 xaml 设计的,请适当使用它:)。
  • 我建议使用虚拟化控件。 100k 行方式对于 UI 来说太多了。
  • 我没有显示 100k 行,但数据网格肯定不喜欢它。虽然更改为列表似乎可以解决我的问题。
  • 为什么一定要手动将每一项添加到集合中,为什么不查询数据的时候,就说new ObservableCollection(data);
  • @Stephen Datagrid 是一个虚拟化控件

标签: c# wpf mvvm task async-await


【解决方案1】:

我从您的编辑中得知,情况可能并非如此,但如果在某些情况下您确实需要集合是可观察的,那么您也可以使用 CollectionViewSource.DeferRefresh() 方法来防止 UI 在之后更新每个人的变化:

private async Task Search()
{
    internalRows.Clear();
    using(ViewSource.DeferRefresh())
    {
        var data = await Task.Run(() => GetSearchResults());

        if (data == null) return;

        foreach (ScreenerRow sRow in data)
        {                
            internalRows.Add(sRow);
        }           
    }
}

还要确保您在控件上正确设置了虚拟化模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多