Виртуализация: есть ли способ перерабатывать сгенерированные контейнеры из вложенного ItemsControl? - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть DataGrid с VirtualizationMode="Recycling", который связан с ObservableCollection в моей ViewModel. Он работает нормально - прокрутка и быстрое перемещение вверх / вниз.

Теперь я добавляю еще DataGridTemplateColumn с ItemsControl в DataTemplate. Он связан примерно с 15 предметами (для всех строк одинаковое количество). Теперь прокрутка намного медленнее. Но если лежащая в основе коллекция пуста, все снова быстро. Я предполагаю, что сгенерированные ItemContainers в каждой строке не будут переработаны.

Есть ли способ ускорить весь процесс или, что еще лучше, перезапустить все вложенные элементы управления в строке?

PS: Я бы предпочел ItemsControl в DataGridColumn, а не DataGridColumn для каждого элемента в коллекции.

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding AObservableCollection}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding AStringProperty}" Width="40" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

1 Ответ

0 голосов
/ 15 апреля 2012

После некоторых дальнейших исследований я могу сказать: проблема не в создании самого контейнера, а в его содержимом. 15 текстовых ящиков тяжелее, чем я думал. Я заменил TextBox на TextBlock, и это было так же быстро, как и раньше.

Поскольку мне нужно редактировать, я изменил DataGridTemplateColumn.CellTemplate на DataGridTemplateColumn.CellEditingTemplate и создал новый шаблон CellTemplate с TextBlock. Я переключаю шаблоны с помощью:

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="IsEditing" Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

, поэтому только в выбранной ячейке / строке отображается TextBox.

Конечно, теперь у меня появились новые проблемы с Focusmanagement и Keyboardnavigation. Но я думаю, что должен сделать это так.

...