GridView в ListView с большим количеством строк, столбцов и шаблонов ячеек
У меня проблема с моим ListView/GridView. Фактически, моя сетка имеет 285 строк и 24 столбца, построенных динамически.
Моя сетка была настолько медленной, что я решил сделать некоторые другие тесты непосредственно в XAML (что теоретически должно быть более эффективным). Все столбцы имеют шаблон CellTemplate.
Вы можете легко воспроизвести проблему с этим:
<Window x:Class="WpfApplication2.HighColumns"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="HighColumns" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="myCellTemplateMonth">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0">
<TextBlock Grid.Column="0" Text="{Binding}"/>
</Border>
<Border Grid.Column="1" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0">
<TextBlock Grid.Column="0" Text="{Binding}"/>
</Border>
</Grid>
</DataTemplate>
</Window.Resources>
<Grid>
<ListView Background="Transparent" BorderThickness="0" Name="lv2" Grid.Column="1">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView x:Name="gv1">
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
<!--<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0">
<TextBlock Grid.Column="0" Text="{Binding}"/>
</Border>
<Border Grid.Column="1" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0">
<TextBlock Grid.Column="0" Text="{Binding}"/>
</Border>
</Grid>
</DataTemplate>
</GridViewColumn.CellTemplate>-->
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
<GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}">
</GridViewColumn>
</GridView>
</ListView.View>
<sys:DateTime>1/2/3</sys:DateTime>
<sys:DateTime>4/5/6</sys:DateTime>
<sys:DateTime>7/8/9</sys:DateTime>
<sys:DateTime>10/11/12</sys:DateTime>
[paste the previous 4 ligns here in order to have around 300 rows]
</ListView>
</Grid>
Вы можете увидеть стиль "двойной столбец" в каждом столбце (с небольшой графической ошибкой, но не обращайте внимания на этот факт).
Основной проблемой здесь является МЕДЛЕННАЯ сетка, она явно не пригодна для использования в качестве профессиональной сетки... Я пытался активировать виртуализацию и отключить ее (когда виртуализация отключена, загрузка сетки занимает около 17-18 секунд...)
Есть ли какие-то хитрости для достижения высокой скорости сетки или я что-то не так делаю? Сначала я использовал WPF Toolkit Datagrid (я использую WPF 3.5 с Windows XP), и у меня возникла та же проблема, так как мне нужно только отображение данных (и вообще никакого издания), я вернулся к "старомодному" ListView с GridView внутри... без эффекта ИМХО..
Спасибо!
РЕДАКТИРОВАТЬ 1: Кажется, я достиг максимума возможности производительности WPF GridView... Приведенный выше пример просто "простой" список... Учтите, что я связываю не просто строку, а словарь и сложную структуру. Кроме того, все это приложение WPF является библиотекой классов, запускаемой надстройкой VSTO.
Вывод: вид сетки не используется как есть... и загружается через 22 секунды, когда я отключаю виртуализацию.
Кажется, мне придется использовать WinForm DataGridView в моем окне WPF... Как вы думаете, проблему можно решить с помощью этого?
1 ответ
Вы уверены, что проблема с GridView? Из старшего проекта я помню, что без проблем визуализировал огромные GridViews (до 100 столбцов).
Попробуйте удалить привязку из вашего DataTemplate и попробуйте, если она медленная, без привязок. Если нет, проблема заключается в методе ToString() ваших исходных объектов.
<DataTemplate x:Key="myCellTemplateMonth">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0">
<TextBlock Grid.Column="0" Text="Test withouth binding"/>
</Border>
<Border Grid.Column="1" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0">
<TextBlock Grid.Column="0" Text="Test withouth binding"/>
</Border>
</Grid>
</DataTemplate>