GridView в ListView с большим количеством строк, столбцов и шаблонов ячеек - PullRequest
1 голос
/ 12 мая 2011

У меня проблема с моим 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 Ответ

0 голосов
/ 12 мая 2011

Вы уверены, что проблема в GridView?В старом проекте я помню, что без проблем визуализировал огромные GridView (до 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>
...