WPF DataGrid 似乎没有虚拟化行

WPF DataGrid doesn't seem to be virtualizing rows

我正在开发一个应用程序,我的大部分内容都通过内置 WPF DataGrid 呈现给用户。这是我的 DataGrid 的样子。除了父 Grid.

上的 RowDefinitions 之外,我什么都没设置
<UserControl xmlns="blah blah blah">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition />
      <RowDefinition Height="Auto"/>
     </Grid.RowDefinitions>

  <DataGrid x:Name="dgrMaterialCollection" 
          IsReadOnly="True" 
          ItemsSource="{Binding Path=MyObservableCollection, UpdateSourceTrigger=PropertyChanged}" 
          AutoGenerateColumns="True" 
          AutoGeneratingColumn="dgrMaterialCollection_AutoGeneratingColumn"
          AutoGeneratedColumns="dgrMaterialCollection_AutoGeneratedColumns"
          CanUserResizeColumns="True" 
          CanUserReorderColumns="True"
          CanUserSortColumns="True"
          EnableRowVirtualization="True"
          EnableColumnVirtualization="True"
          VirtualizingPanel.IsVirtualizingWhenGrouping="True"
          VirtualizingPanel.VirtualizationMode="Standard"
          VirtualizingPanel.IsVirtualizing="True"
          SelectionMode="Single"
          SelectionUnit="FullRow"
          ScrollViewer.CanContentScroll="False"
          RowHeaderWidth="0" 
          Grid.Row="0"
          RowHeight="32"
          RowDetailsVisibilityMode="Collapsed">
  <DataGrid.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="DataGridStyle.xaml"/>
      </ResourceDictionary.MergedDictionaries>

      <!-- A few value converters -->
     </ResourceDictionary>
   </DataGrid.Resources>
   <!-- Some Manually Declared Columns -->
  </DataGrid>
  <StackPanel Grid.Row="1">
    <SomeTextBoxes/>
  </StackPanel>
 </Grid>
</UserControl>

当我的应用程序显示 DataGrid 时,会有大约 10 - 20 秒的延迟,具体取决于数据集的大小。在此延迟期间,UI 被锁定。一旦加载了数据网格——我可以毫不拖延地滚动浏览所有几千个项目。当我说没有延迟时,我的意思是单击滚动条并尽可能快地上下移动它,在滚动时渲染行时没有延迟。虚拟化似乎不起作用,而是数据网格一次创建所有行,而不是在用户滚动时创建。

我的 Datagrid 嵌套在以下结构中(分布在多个 xaml 文件中)。没有额外的 ScrollViewersStackPanels 或任何东西。就是这个。

<RibbonWindow>
  <Grid>
    <ContentControl> <!-- Populated via a DataTemplate and ContentTemplateSelector -->
      <UserControl>
        <UserControl>
          <UserControl>
            <Grid>
              <Here is the DataGrid> 

一些我尝试加快加载速度的东西

我知道延迟不是由填充 ObservableCollection 引起的。它在集合完全填充后开始,当 WPF DataGrid 渲染所有 rows/columns 时。我启用了虚拟化,但它仍然需要很长时间。我正在使用 .NET Framework 4.5.1(因此 Virtualization 的 4.6 问题不会导致此问题)。在 UI.

中排序(使用内置数据网格排序)和调整列大小时也有很长的延迟

我在这里错过了什么?我可以做些什么来确保 Virtualization 正常工作吗?有哪些事情可以加快速度?如果我知道 Virtualization 正在工作,那么我可能会转向新策略,例如分页或某种延迟加载。我愿意使用的另一种解决方案是在呈现所有行时用户界面不是 blocked/frozen 的解决方案。这样用户至少可以在添加行的同时点击其他东西。

DataGrid 元素上的 ScrollViewer.CanContentScroll 值必须设置为 True 才能使行虚拟化正常工作。 Here is an explanation 为什么必须这样设置。

感谢 ChrisW 在对此问题的评论中发现这一点。