0

我有一个包含 1000 行的数据网格。ItemsSource 是一个 CollectionViewSource。我的 CollectionViewSource 的源是一个 BindingList,其中包含我称为 RowTypes 的对象。我的 RowType 对象实现了 INotifyPropertyChanged。每个 RowType 的一个属性大约每两秒更改一次。这意味着我的数据网格的其中一列中的值每两秒更改一次。

我的问题是此更新会影响用户体验。此更新大约需要一秒钟,在此期间用户无法对 GUI 执行任何操作。如果在用户滚动数据网格的记录时发生此更新,滚动将停止(冻结),然后在一秒钟后向前跳转。这让人分心。

有没有办法在更新执行此更新时防止我的窗口冻结?

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 行。除非我想那里有大量的行,否则这不应该花一秒钟。

于 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 回答