虚拟化:有没有办法从嵌套的ItemsControl回收生成的容器?

时间:2012-04-02 14:57:03

标签: wpf performance optimization virtualization itemscontrol

我的DataGrid VirtualizationMode="Recycling"与我的ViewModel中的ObservableCollection绑定了DataGridTemplateColumn。它工作正常 - 滚动和页面向上/向下很快。

现在我在其ItemsControl中添加DataTemplate <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}}。它约有15个项目(所有行数相同)。现在滚动速度要慢得多。但是如果底层Collection是Null,那么一切都很快。我假设每行中生成的ItemContainers都不会被回收。

有没有办法加快整个过程,甚至更好地回收行中所有嵌套控件?

PS:我更喜欢DataGridColumn中的ItemsControl,而不是Collection中每个Item的DataGridColumn。

{{1}}

1 个答案:

答案 0 :(得分:0)

在做了一些进一步的研究后,我可以说:问题不是容器本身的创建,而是容器的内容。我认为15个文本框比较重。我已将TextBox替换为TextBlock,并且速度与以前一样快。

因为我需要编辑,所以我将DataGridTemplateColumn.CellTemplate更改为DataGridTemplateColumn.CellEditingTemplate并使用TextBlock创建了一个新的CellTemplate。我用以下方式切换模板:

<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上遇到了新问题。但我想我必须这样做。