У меня проблемы с производительностью сетки данных, которую я строю динамически.
У меня 8 замороженных столбцов, а остальные создаются динамически.
Для тестирования я использую ~ 1000 строк и 100 столбцов. Я не использую виртуализацию данных, потому что весь сбор данных составляет примерно 25 МБ. Однако у меня проблемы с производительностью при прокрутке. Я знаю, что это очень распространенная проблема, и я прочитал несколько полезных ресурсов, включая статью « Оптимизация производительности приложений WPF » на веб-сайте MSDN и другое решение, представленное здесь на StackOverflow.
Кроме того, родительским контейнером сетки данных является Grid
, а не StackPanel
(я читал, что сетка данных будет отображать все строки, даже если они не видны).
XAML
для моей таблицы данных это:
<cg:ColouredDataGrid Grid.Column="0"
x:Name="usagesDataGrid"
AutoGenerateColumns="False"
SelectionUnit="Cell"
ItemsSource="{Binding Records}"
Block.TextAlignment="Center"
VirtualizingStackPanel.IsVirtualizing="true"
VirtualizingStackPanel.VirtualizationMode="Recycling"
ScrollViewer.IsDeferredScrollingEnabled="True" DataContext="{Binding}"
ScrollViewer.CanContentScroll="True"
EnableColumnVirtualization="False" .../>
ColouredDataGrid
- это пользовательский класс, который я создал, в котором я переопределил метод PrepareContainerForItemOverride
, чтобы я мог условно применить пользовательскую раскраску к строкам.
Проблема в том, что при отладке при каждой прокрутке метод PrepareContainerForItemOverride
запускается для каждой новой строки, которая становится видимой. Разве он не должен срабатывать, поскольку VirtualizationMode
установлен на Recycling
? Разве он не должен повторно использовать контейнеры, уже созданные для этих предметов?
Может кто-нибудь объяснить мне, что я делаю не так?
Большое спасибо.