I have created a MultiSelection Tree view, which supports virtualization. When I try to expand it and add columns, virtualization stops working.
Can anyone spot what I'm missing? Is it necessary to wrap the scroller/grids by other elements, for instance? Thanks!
The working tree's xaml is pretty simple - no styling (except to have all items expanded) I placed the new tree (which has columns) alongside the old one (same main grid). It is formatted like this:
<window:TreeListView Grid.Row="0" ItemsSource="{Binding Path=Coverages}" x:Name="MainTree" Margin="4,0,0,0" GridViewColumnHeader.Click="TreeListView_ColumnHeaderClicked" Loaded="MainTree_OnLoaded" Unloaded="MainTree_OnUnloaded" PreviewMouseRightButtonUp="ShowContextMenu" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" >
<window:TreeListView.Resources>
<HierarchicalDataTemplate DataType="{x:Type window:CoverageSummary}" ItemsSource="{Binding CoveredProjects}" />
<HierarchicalDataTemplate DataType="{x:Type window:ProjectCoverageSummary}" ItemsSource="{Binding CoveredPrograms}" />
<HierarchicalDataTemplate DataType="{x:Type window:ProgramCoverageSummary}" ItemsSource="{Binding ElementsSummaryList}" />
</window:TreeListView.Resources>
<window:TreeListView.Columns>
<GridViewColumn>
<GridViewColumnHeader Style="{StaticResource ColumnHeaderStyle}" Content="{x:Static codeCoverageNs:Resources.HierarchyColumnTitle}" Name="Hierarchy"/>
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Tag="{Binding}" Margin="0,2,0,2">
<window:TreeListViewExpander/>
<Image Style="{StaticResource TreeEntryImageStyle}" />
<TextBlock Text="{Binding SummaryType, Converter={StaticResource EnumToStringConverter}}" Tag="{Binding}" VerticalAlignment="Center" Visibility="{Binding SummaryType, Converter={StaticResource SummaryBlockTypeVisibilityConverter}}" />
<TextBlock Text=":__ " Tag="{Binding}" VerticalAlignment="Center" Visibility="{Binding SummaryType, Converter={StaticResource SummaryBlockTypeVisibilityConverter}}"/>
<TextBlock Text="{Binding SummaryName}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</window:TreeListView.Columns>
</window:TreeListView>
and its style looks like this:
<Style TargetType="{x:Type window:TreeListView}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type window:TreeListView}">
<ControlTemplate.Resources>
<Style TargetType="TreeViewItem" BasedOn="{StaticResource VSTreeViewItem}">
<Setter Property="Template" Value="{StaticResource TreeListViewItem}"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="IsExpanded" Value="True"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static mfcolors:Environment.ToolWindowTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static mfcolors:Environment.ToolWindowBackgroundBrushKey}}" />
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static mfcolors:Environment.ToolWindowBackgroundBrushKey}}" />
<EventSetter Event="PreviewMouseDoubleClick" Handler="MainTree_OnPreviewItemDoubleClicked"/>
<EventSetter Event="KeyDown" Handler="MainTree_OnItemKeyDown"/>
<EventSetter Event="MouseRightButtonDown" Handler="MainTree_OnItemRightButtonDown"/>
</Style>
<Style TargetType="window:TreeListViewExpander">
<Setter Property="Template" Value="{StaticResource TreeListViewExpander}"/>
</Style>
</ControlTemplate.Resources>
<Border removed="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True">
<Grid ScrollViewer.CanContentScroll="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<GridViewHeaderRowPresenter Columns="{TemplateBinding Columns}" AllowsColumnReorder="{TemplateBinding AllowsColumnReorder}">
</GridViewHeaderRowPresenter>
<ScrollViewer HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"
Grid.Row="1" ScrollViewer.CanContentScroll="True">
<ItemsPresenter/>
</ScrollViewer>
</Grid>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
What I have tried:
Using Snoop, and relying on previous posts, I tried setting VirtualizingStackPanel.IsVirtualizing="True" and ScrollViewer.CanContentScroll="True" on the tree and scrollers. No good...