如何在不冻结的情况下更新DataGrid.ItemsSource?

时间:2017-03-27 12:54:05

标签: c# .net wpf

我尝试更新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} ...等等。什么都没有帮助我。

2 个答案:

答案 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;
    }

}