簡體   English   中英

更改ObservableCollection / CollectionViewSource時UI凍結

[英]UI freezing when altering ObservableCollection/CollectionViewSource

我有一個數據網格正在接收100,000+行的更新,該行綁定到源為ObservableCollection的CollectionViewSource.View。 如果我嘗試在當前設置中進行更新,則在將新行添加到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更改為列表,可以使其正常工作。

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

我從您的編輯中得出可能不是這種情況,但是如果確實需要實際觀察集合,則還可以使用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);
        }           
    }
}

還要確保在控件上正確設置了虛擬化模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM