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