нужна помощь в оптимизации производительности сетки данных - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть DataGrid с 3000 строк и 12 столбцов. DataGrid доступен только для чтения и содержит только текстовые поля. Эти текстовые поля содержат данные, которые не превышают 50 символов. Это XAML DataGrid:

<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 МБ ОЗУ. Это слишком много. Как мне это исправить?

Я думал, что в DataGrids настроена виртуализация по умолчанию, но это не так. Я пытался добавить VirtualizingStackPanel.IsVirtualizing = "False" к элементам DataGrid и DataGridTextColumn, но это не помогло.

Как я уже сказал, существует только 3000 строк данных, поэтому я не вижу смысла в реализации виртуализации данных. Или, может быть, я должен?

Я также попытался добавить следующий XAML:

  <DataGrid.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel/>
            </ItemsPanelTemplate>
        </DataGrid.ItemsPanel>

Ответы [ 3 ]

4 голосов
/ 28 декабря 2011

Если это только для чтения, тогда используйте GridView ListView. И использовать TextBlock (не TextBox). DataGrid - это тяжелый контроль веса, и с ним связано много накладных расходов. ListView имеет хорошую виртуализацию пользовательского интерфейса (используйте повторное использование и отложенную прокрутку). Возможно, вам придется перейти к виртуализации данных, но я бы начал с оптимизации пользовательского интерфейса. У меня есть очень большой список в ListView с отличной производительностью.

Имел комментарий к GridView и предложил изменить его, чтобы удалить. Настоящий работник - это ListView. GridView - это просто форматирование. Вы перечисляете 12 столбцов, и чтобы получить столбцы для выравнивания, GridView прост и понятен. ListView с шаблоном (и без GridView) - опция, но не та, которую я использовал бы в этом случае.

2 голосов
/ 28 декабря 2011

Я бы посоветовал взглянуть на виртуализацию данных.

Об этом есть хорошая статья CodeProject здесь и хороший пост в блоге, объясняющий некоторые входы и выходы здесь .

По сути, вы кешируете только куски данных (управляемые объемы), а остальное - заполнители в элементе управления.Когда вы прокручиваете больше элементов в поле зрения, элементы в конце загружаются, и элементы, которые вы ранее просматривали, могут быть либо сохранены, либо выброшены на ваше усмотрение.Все зависит от ваших обстоятельств.

Это действительно зависит от ваших данных, как вы будете реализовывать, поэтому я пока не буду пытаться привести пример.

0 голосов
/ 28 декабря 2011

CanContentScroll должен быть установлен в true.Если для этого параметра установлено значение false, принудительно отключается виртуализация.

...