如何解决将列表转换为 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()
更改上调用 SelectedProperty
时,UI 会冻结,直到记录显示在 DataGrid
中。
我认为将 List<Transaction>
转换为 ObservableCollection<Transaction>
是原因。我尝试了很多方法,比如 Task.Run()
,使用 Dispather.BeginInvoke
但没有任何效果。
从数据库 `Context.Transaction.Where()....ToListAsync()) 获取值不会冻结 UI,我已经检查过。删除“列表”到“ObservableCollection”的转换后,UI 不会冻结。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。