首页 > 解决方案 > 将列表转换为 ObservableCollection 冻结 WPF 中的 UI

问题描述

ObservableCollection<Transaction> transactions;

public ObservableCollection<Transaction> Transactions
{
        get { return transactions; }
        set
        {
                transactions = value;
                RaisePropertyChanged("transactions");
        }
}
    
private Property selectedProperty;

public Property SelectedProperty
{
        get { return selectedProperty; }
        set
        {
                selectedProperty = value;
                RaisePropertyChanged("SelectedProperty");
                Task.Run(async () => await GetTransactions());
        }
}

private async Task GetTransactions()
{
        try
        {
                IsProgressing = true;
                if (SelectedProperty == null)
                {
                        Transactions = null;
                        return;
                }

                var tranList = new List<Transaction>();
                decimal balance = 0;
                foreach (var tran in await context.Transactions
                    .Where(t => t.PropertyId == SelectedProperty.Id)
                    .OrderBy(t => t.Date).ToListAsync())
                {
                        if (!tran.IsMisc)
                        {
                                balance = balance - tran.AmountPaid + tran.AmountDue;
                        }
                        if (tran.IsRentStart)
                        {
                                balance = 0;
                        }
                        tran.Balance = balance;
                        tranList.Add(tran);
                }

                Transactions = new ObservableCollection<Transaction>(
                    tranList.OrderByDescending(t => t.Date));
                OutstandingAmount = Transactions.Select(t => t.Balance)
                    .FirstOrDefault() + SelectedProperty.OutstandingAmount;

        }
        catch (Exception ex)
        {
                 MessageBox.Show(ex.Message, "Error");
        }
        finally
        {
                IsProgressing = false;
        }
}

在调用下拉菜单的GetTransactions()on SelectedPropertychange 时,UI 会冻结,直到记录显示在DataGrid.

我认为转换List<Transaction>ObservableCollection<Transaction>是原因。我尝试了很多方法,例如Task.Run(),使用Dispather.BeginInvoke但没有任何效果。从数据库 `Context.Transaction.Where()....ToListAsync()) 获取值不会冻结 UI,我已经检查过了。在删除“List”到“ObservableCollection”的转换时,UI 不会冻结。

标签: c#wpfmultithreadingasynchronousobservablecollection

解决方案


推荐阅读