我有一个包含3000行和12列的DataGrid。 DataGrid是只读的,只包含文本字段。这些文本字段包含不超过50个字符的数据。这是DataGrid的XAML:
<DataGrid SelectionUnit="Cell" Grid.Column="1" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" ScrollViewer.CanContentScroll="False" DataGrid:SelectedItem.AutoScroll="True" SelectedItem="{Binding Path=SelectedItem}" ItemsSource="{Binding Path=GridData}" Name="DataGrid1" >
<DataGrid.Columns>
<DataGridTextColumn Header="{x:Static props:Resources.Header1}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header2}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header3}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header4}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header5}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header6}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}" Visibility="{Binding Path=DataContext.ColumnVisibility, RelativeSource={x:Static RelativeSource.Self}}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header7}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header8}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header9}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header10}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header11}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
<DataGridTextColumn Header="{x:Static props:Resources.Header12}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/>
</DataGrid.Columns>
</DataGrid>
加载DataGrid需要30秒和300 MB的RAM。这太过分了。我如何解决它?
我认为DataGrids默认配置了虚拟化,但似乎并非如此。我已经尝试将VirtualizingStackPanel.IsVirtualizing =“False”添加到DataGrid和DataGridTextColumn元素,但这没有帮助。
正如我已经说过的,只有3000行数据,所以我认为实现数据虚拟化没有任何意义。或许我应该?
我也尝试过添加以下XAML:
<DataGrid.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</DataGrid.ItemsPanel>
答案 0 :(得分:4)
如果它是只读的,那么请使用GridView ListView。并使用TextBlock(而不是TextBox)。 DataGrid是一个重量级控件,它带来了很多开销。 ListView具有良好的UI虚拟化(使用回收和延迟滚动)。您可能需要转到Data Virtualization,但我会从优化UI开始。我在ListView中有一些非常大的列表,性能很好。
对GridView发表评论并建议删除它。真正的工作者是ListView。 GridView只是格式化。您列出了12列并获得了allign的列GridView简洁明了。带有模板的ListView(没有GridView)是一个选项 - 在这种情况下我不会选择使用它。
答案 1 :(得分:2)
我建议调查数据虚拟化。
有一篇很好的CodeProject文章here和一篇很好的博客文章解释了一些细节here。
基本上,您只缓存数据块(可管理的数量),其余的是itemscontrol中的占位符。当您将更多项目滚动到视图中时,末尾的项目将被加载,您之前查看过的项目可以保留或丢弃。这一切都取决于你的情况。
这实际上取决于你的数据如何实现,所以我还没有尝试一个例子。
答案 2 :(得分:0)
CanContentScroll应设置为true。如果我将其设置为false,我将强制关闭虚拟化。