Wpf 如果虚拟化模式=回收,是否应触发PrepareContainerForItemOverride或OnLoadingRow事件?

Wpf 如果虚拟化模式=回收,是否应触发PrepareContainerForItemOverride或OnLoadingRow事件?,wpf,datagrid,windows-xp,Wpf,Datagrid,Windows Xp,我动态构建的datagrid存在性能问题。 我有8个冻结列,其余的是动态创建的 对于测试,我使用约1000行和100列。我不使用数据虚拟化,因为整个数据收集大约是25MB。但是,我在滚动时遇到性能问题。我知道这是一个非常常见的问题,我已经阅读了一些有用的参考资料,包括MSDN网站上的文章和StackOverflow上的其他解决方案 此外,datagrid的父容器是一个网格,而不是StackPanel。我读到datagrid将呈现所有行,即使它们不可见 我的datagrid的XAML如下所示: &

我动态构建的datagrid存在性能问题。 我有8个冻结列,其余的是动态创建的

对于测试,我使用约1000行和100列。我不使用数据虚拟化,因为整个数据收集大约是25MB。但是,我在滚动时遇到性能问题。我知道这是一个非常常见的问题,我已经阅读了一些有用的参考资料,包括MSDN网站上的文章和StackOverflow上的其他解决方案

此外,datagrid的父容器是一个网格,而不是StackPanel。我读到datagrid将呈现所有行,即使它们不可见

我的datagrid的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" .../>
ColumedDataGrid是我创建的一个自定义类,我在其中重写PrepareContainerForItemOverride方法,以便有条件地对行应用自定义着色

问题是,在调试时,每次滚动时,PrepareContainerForItemOverride方法都会为每个可见的新行激发。既然虚拟化模式设置为循环使用,它不应该启动吗?它不应该重用已经为这些项目创建的容器吗

有人能给我解释一下我做错了什么吗


非常感谢。

我知道设置virtualizangstackpanel.is虚拟化不足以启用虚拟化。有关更多信息,请参阅。默认情况下,DataGrids应该启用虚拟化。只需确保他们的高度是有限的,以便他们显示他们的滚动条高度是有限的,我有滚动条,并且“ScrollViewer.CanContentScroll”属性设置为“True”。我在重读您的问题时删除了我的答案,我似乎有点误解了您的问题:再考虑一下,我认为应该在容器中充满新元素时触发事件。我想你可以优化你的覆盖返回,如果有一部分是不应该在滚动时重做的。好吧,让我直说吧。。。重新绘制容器与重新创建容器不同,对吗?我正在做的是重新绘制容器,因为它可能有不同的背景色,这取决于之前使用它的行?