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将被丢弃。