c# - 将列表转换为 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 SelectedProperty
change 时,UI 会冻结,直到记录显示在DataGrid
.
我认为转换List<Transaction>
为ObservableCollection<Transaction>
是原因。我尝试了很多方法,例如Task.Run()
,使用Dispather.BeginInvoke
但没有任何效果。从数据库 `Context.Transaction.Where()....ToListAsync()) 获取值不会冻结 UI,我已经检查过了。在删除“List”到“ObservableCollection”的转换时,UI 不会冻结。
解决方案
推荐阅读
- json - 如何在 Flutter 中直接持久化存储 JSON 数据以供查询和离线使用?
- c - 具有 int 和 char 的堆栈的 C 程序
- c++ - `if constexpr (false)` 总是计算为真
- mapstruct - 是否有注释可以忽略映射将在子类中覆盖的特定抽象方法?
- php - “eregi”在 php5.6 中工作,但“preg_match”替换在 php 7.2 中不起作用
- list - Unity3d:在单击生成新游戏对象之前销毁子对象
- c# - 默认构造函数在不需要时不必要地初始化依赖项
- c++ - Visual Studio 2017 for Dymola 无法打开 stdio.h
- karate - 为什么我们可以从空手道函数中设置列表而不是常量?
- javascript - 滚动时消失的移动菜单