我尝试更新DataGrid.ItemsSource而不冻结
如果有:
public static DataTable DataTableAccounts { get; set; }
我从DataBase(SQLite)获得
要在程序中显示此数据,我写
DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView;
更改 DataTableAccounts 中的数据后,我更新了DataGrid
DataGridAccounts.ItemsSource = null;
DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView;
但我每隔1秒就会这样做,因为 DataTableAccounts 中的数据变化如此之快。 由于此次更新,我会冻结窗口程序。
问题: 如何在不冻结的情况下更新DataGridAccounts.ItemsSource?
P.S。我尝试在XAML代码中使用(async \ aswait)... ItemsSource = {Binding} ...等等。什么都没有帮助我。
答案 0 :(得分:1)
你工作太辛苦了。您只需将数据网格项源设置为数据表即可。
DataGridAccounts.ItemsSource = DataTableAccounts;
随着数据表的更改,网格将更新。
答案 1 :(得分:0)
以下示例每10秒运行后台服务以更新GUI。您可以根据需要进行修改。通过将线程作为异步任务运行,您的GUI永远不会挂起。
public frm_testform()
{
InitializeComponent();
dispatcherTimer_Tick().DoNotAwait();
}
private async Task dispatcherTimer_Tick()
{
DispatcherTimer timer = new DispatcherTimer();
TaskCompletionSource<bool> tcs = null;
EventHandler tickHandler = (s, e) => tcs.TrySetResult(true);
timer.Interval = TimeSpan.FromSeconds(10);
timer.Tick += tickHandler;
timer.Start();
while (true)
{
tcs = new TaskCompletionSource<bool>();
await Task.Run(() =>
{
// Run your background service and UI update here
await tcs.Task;
}
}