应用程序冻结,同时为DataGrid行创建可视容器

时间:2010-09-28 14:51:03

标签: c# wpf

我目前正在处理一个问题,这个问题让我在过去几周左右的脚趾。

这不是多线程可解决的正常冻结问题,因为我已经为业务逻辑做了这个。

我有一个带有DataGrid的View,DataContext是一个ViewModel,为名为ObservableCollection<T>的{​​{1}}提供CollectionViewSource

iGroupingJournal

通常,显示大约50行有7列,这会导致应用程序在生成这些行时冻结。

我已经排除了以下原因:

1.1。复杂的商业类产生开销 - &gt;使用数据保持类测试,不会产生速度增加

1.2。由于通过LINQ获取数据,因此在gui线程中执行昂贵的数据库查询 - &gt;通过调用<DataGrid Grid.Row="1" ItemsSource="{Binding Source={StaticResource iGroupedJournal}}"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=DateTime}" Header="DateTime" /> [...] </DataGrid.Columns> </DataGrid> 并将数据映射到前面提到的持有类,可以在workerthread中获取数据

1.3。集合分组增加了开销 - &gt;删除了ToList中的分组标题。

以下测试或考虑过:

2.1。通过删除分组指令测试UI虚拟化,没有任何影响,分组也是一个可取的功能

2.2。数据虚拟化 - 不会产生影响,因为必须创建50行,这是通常显示的

结论

我尽我所能将工作从GUI线程中解脱出来,并且LoadingIndicator清楚地看到,当workerthread将CollectionViewSource发送到GUI线程时,整个应用程序冻结。你以前遇到过这个问题吗?你是怎么解决的?或者我真的不走运?

1 个答案:

答案 0 :(得分:0)

原因是分组。我想我可以删除CollectionViewSource中的群组,但情况并非如此 - 我还需要移除GroupTemplate