2017-03-27 12 views
1

私が持っている場合はフリーズフリーズすることなくDataGrid.ItemsSourceを更新するにはどうすればよいですか?

なしDataGrid.ItemsSourceを更新しよう:

私はプログラムでこのデータを表示するには、データベース(SQLiteの)

から取得し、私は

を書く
public static DataTable DataTableAccounts { get; set; } 

DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView; 

DataTableAccountsのデータを変更した後、データを更新します。グリッド

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

しかしDataTableAccounts内のデータはとても速く変化しているので、私は、1秒毎ことを行います。 そして、このアップデートのために私はフリーズウィンドウのプログラムを取得します。

質問: フリーズすることなくDataGridAccounts.ItemsSourceを更新する方法はありますか?

p.s.私は(async \ aswait)... ItemsSource = {Binding}をXAMLコードで使用しようとしています。何も私を助けなかった。

+0

WPFでバインディングを使用している場合は、グリッドが更新されたときに手動でUIを更新する必要はありません。それは拘束力によって注意を払われるだろう。列バインディングを設定しましたか? – NoSaidTheCompiler

+0

@ NoSaidTheCompiler、mbちょうどコードからUIを更新できますか?はい、私は列のバインディングを設定します – skvoshiz

+0

私がアプローチで見る1つの問題は、アイテムのソース全体を設定することです。もしそれが1000sの行であれば、レンダリング中にperfヒットを取るでしょう。 Bindingを使用すると、変更されたプロパティのみが更新され、そのように優れたパフォーマンスが得られる可能性があります。私はそれをテストするためのサンプルコードを書いていませんでした.. – NoSaidTheCompiler

答えて

0

次の例では、GUIを更新するために10秒ごとにバックグラウンドサービスを実行しています。必要に応じて変更することができます。スレッドを非同期タスクとして実行すると、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;

データテーブルが変更されると、グリッドが更新されます。

関連する問題