Wpf 虚拟化:是否也有方法从嵌套项控件回收生成的容器?

Wpf 虚拟化:是否也有方法从嵌套项控件回收生成的容器?,wpf,performance,optimization,virtualization,itemscontrol,Wpf,Performance,Optimization,Virtualization,Itemscontrol,我有一个带有VirtualizationMode=“Recycling”的DataGrid,它绑定到我的ViewModel中的一个observeCollection。它的工作原理很好,滚动和上下翻页都很快 现在,我又添加了一个DataGridTemplateColumn,在其DataTemplate中有一个ItemsControl。它绑定到大约15个项目(对于所有行,计数相同)。现在滚动要慢得多。但是,如果基础集合为Null,则all将再次快速运行。我假设每行中生成的ItemContainer不

我有一个带有
VirtualizationMode=“Recycling”
DataGrid
,它绑定到我的ViewModel中的一个
observeCollection
。它的工作原理很好,滚动和上下翻页都很快

现在,我又添加了一个
DataGridTemplateColumn
,在其
DataTemplate
中有一个
ItemsControl
。它绑定到大约15个项目(对于所有行,计数相同)。现在滚动要慢得多。但是,如果基础集合为Null,则all将再次快速运行。我假设每行中生成的ItemContainer不会被回收

有没有办法加快整个过程,或者更好地回收行中的所有嵌套控件

PS:我更喜欢DataGridColumn中的ItemsControl,而不是集合中每个项的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>

在做了进一步的研究之后,我可以说:问题不在于容器本身的创建,而在于容器的内容。15个文本框比我想象的要重。我用
TextBlock
替换了
TextBox
,速度和以前一样快

由于需要编辑,我将
DataGridTemplateColumn.CellTemplate
更改为
DataGridTemplateColumn.CellEditingTemplate
,并使用文本块创建了一个新的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>

因此,只有选定的单元格/行显示
文本框


当然,现在我在焦点管理和键盘导航方面遇到了新问题。但是我认为我必须这样做。

在做了进一步的研究之后,我可以说:问题不在于容器本身的创建,而在于容器的内容。15个文本框比我想象的要重。我用
TextBlock
替换了
TextBox
,速度和以前一样快

由于需要编辑,我将
DataGridTemplateColumn.CellTemplate
更改为
DataGridTemplateColumn.CellEditingTemplate
,并使用文本块创建了一个新的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>

因此,只有选定的单元格/行显示
文本框


当然,现在我在焦点管理和键盘导航方面遇到了新问题。但我想我必须这样做。

请显示您的项目绑定控制一个hack,但公开一个文本属性,将MyObservableCollection中的项目连接到字符串。我不能,因为我需要单独的编辑、选项卡导航、contextmenu、alternativ detailview而不是TextBox等等…尝试ListView。我没有带代码,但我使用了ListView绑定到ListView Gridview和完全虚拟化中的集合。同样的问题。ListView中的虚拟化还可以,但ListViewItem中的ItemContainers将被丢弃。请显示您的items的绑定Controla hack,但公开将MyObservableCollection中的项目连接到字符串的文本属性。我不能,因为我需要单独的编辑、选项卡导航、contextmenu,alternativ detailview而不是TextBox等等…尝试ListView。我没有带代码,但我使用了ListView绑定到ListView Gridview和完全虚拟化中的集合。同样的问题。ListView中的虚拟化还可以,但ListViewItem中的ItemContainers将被丢弃。