0

1000 行のデータグリッドがあります。ItemsSource は CollectionViewSource です。私の CollectionViewSource のソースは、私が RowTypes と呼んだオブジェクトを含む BindingList です。私の RowType オブジェクトは INotifyPropertyChanged を実装しています。各 RowType の 1 つのプロパティは、約 2 秒ごとに変更されます。これは、データグリッドの列の 1 つの値が 2 秒ごとに変化することを意味します。

私の問題は、この更新がユーザー エクスペリエンスに影響を与えることです。この更新には約 1 秒かかり、その間、ユーザーは GUI で何もできません。ユーザーがデータグリッドのレコードをスクロールしているときにこの更新が発生すると、スクロールが停止 (フリーズ) し、1 秒後にジャンプします。気を散らします。

この更新の実行中にウィンドウがフリーズしないようにする方法はありますか?

4

3 に答える 3

2

別のスレッド (UI スレッドではない) で読み取り操作を実行するだけです。WPF は、ビューのスカラー プロパティを完全に変更します。新しいタスクを簡単に開始できます。

System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    try
    {
        // This method is heavy call - to the DataBase or to the WebService
        ReadData(); 
        // In this method, do the updates of the properties of 
        // your RowType collection. You can do it in previous method.
        UpdateData();
     }
    catch (Exception e)
    {
        // you can log the errors which occurs during data updating
        LogError(e); 
    }
});
于 2012-12-18T17:14:13.310 に答える
0

DataGrid の仮想化がオンになっていることを確認します。これをオンにすると、1000 行すべてではなく、画面に表示されているものだけを実際に更新する必要があります。そこに狂った数の行がない限り、1秒もかからないはずです。

于 2012-12-18T17:01:07.033 に答える
0

試しましたDeferRefresh()か?

var view = CollectionViewSource.GetDefaultView(RowTypesList);
using (view.DeferRefresh())
{
    // perform updates here
}
于 2012-12-18T19:16:52.350 に答える