需要帮助优化数据网格的性能

时间:2011-12-28 14:37:10

标签: wpf performance mvvm datagrid virtualization

我有一个包含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>

3 个答案:

答案 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,我将强制关闭虚拟化。