2017-03-27 78 views
1

我尝试,如果有更新DataGrid.ItemsSource不结冰如何更新DataGrid.ItemsSource而不冻结?

public static DataTable DataTableAccounts { get; set; } 

这是我从数据库中获取(SQLite的)

要在程序中显示这个数据,我写

DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView; 

更改DataTableAccounts中的数据后,我更新Data电网

DataGridAccounts.ItemsSource = null; 
DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView; 

但我做每1秒,因为在DataTableAccounts数据变化太快了。 由于这个更新,我得到了冻结窗口程序。

问题: 如何更新DataGridAccounts.ItemsSource而不冻结?

p.s.我尝试使用(异步\ aswait)... ItemsSource = {绑定}在XAML代码...和其他。没有什么帮助我。

+0

如果它是WPF,并且您正在使用绑定,则在更新网格时不需要手动刷新UI;那会受到绑定的关注。你有没有设置你的列绑定? – NoSaidTheCompiler

+0

@NoSaidTheCompiler,MB我只是可以从代码刷新UI?是的,我设置了列绑定 – skvoshiz

+0

我看到的一个问题是,您将设置整个项目源,如果它是1000行,您将在呈现时执行perf命中。使用绑定,它只会更新更改的属性,可能会为您提供更好的性能。我没有写一个示例代码来测试,虽然.. – NoSaidTheCompiler

回答

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

} 
0

你正在努力工作。您只需将数据网格项源设置为数据表。

DataGridAccounts.ItemsSource = DataTableAccounts;

随着数据表的变化,网格会更新。