2010-09-28 62 views
0

我目前正在研究一個問題,它讓我在最後幾周左右的腳趾上。爲DataGrid行創建可視容器時凍結應用程序

這不是一個可以通過多線程解決的正常凍結問題,因爲我已經在爲業務邏輯執行此操作。

我有一個DataGrid查看,DataContext是一個ViewModel提供ObservableCollection<T>CollectionViewSource名爲iGroupingJournal

<DataGrid Grid.Row="1" ItemsSource="{Binding Source={StaticResource iGroupedJournal}}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=DateTime}" Header="DateTime" /> 
     [...] 
    </DataGrid.Columns> 
</DataGrid> 

通常,顯示大約50行7列,這會導致應用程序在生成這些行時凍結。

我已經排除了以下的原因是:

1.1。複雜的業務級別生產開銷 - >測試數據持有類,產生不增加速度

1.2。昂貴的數據庫查詢得到的GUI線程由於經由LINQ獲取數據執行 - >數據得到由caling ToList並將數據映射到前述保持類

1.3在的WorkerThread取出。收集分組會增加開銷 - >刪除CollectionViewSource中的分組標題。

下進行測試或想到:

2.1。通過刪除分組指令測試UI虛擬化沒有任何影響,分組也是一個需要的功能

2.2。數據虛擬化 - 會不會有效果,因爲50行必須創建爲這就是通常顯示

結論

我做了所有我能得到的工作出了GUI線程,而且它顯然一個LoadingIndicator可以看出,當工作線程發送NotifyCollectionChanged到GUI線程時,整個應用程序就會凍結。你以前遇到過這個問題嗎?你是如何解決它的?或者我真的運氣不好?

回答

0

原因是分組。我以爲我可以從CollectionViewSource中刪除這些組,我不需要刪除GroupTemplate