1
votes

I have a multilevel TreeView upto 4 levels as below :

 <HierarchicalDataTemplate ItemsSource="{Binding TestModuleStatementList}" x:Key="level4" ItemTemplate="{StaticResource level5}">
                <Grid>
                    <Grid.ColumnDefinitions>

                        <ColumnDefinition Width="600"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Margin="1,1,0,1" Name="lblStatementName" Style="{StaticResource TreeLabelStyle}" MouseLeftButtonUp="ViewTestDataTree_MouseLeftButtonUp" MouseRightButtonUp="ViewTestDataTree_MouseRightButtonUp" Padding="2,2,2,2" Text="{Binding DisplayText}" />
                    <Border Grid.Column="1" Margin="0,0,-2,0" Style="{StaticResource BorderStylePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockPassCountStyleTestData}"/>
                    </Border>

                    <Border Grid.Column="2" Margin="0,0,-2,0" Style="{StaticResource BorderStyleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockFailCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="3" Margin="0,0,-2,0" Style="{StaticResource BorderStyleModulePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModulePassCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="4" Margin="0,0,-2,0" Style="{StaticResource BorderStyleModuleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModuleFailCountStyleTestData}"/>
                    </Border>
                </Grid>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding TestModules}" x:Key="level3" ItemTemplate="{StaticResource level4}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="620"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Margin="1,1,0,1" Name="lblCategoryName" Style="{StaticResource TreeLabelStyle}" MouseLeftButtonUp="ViewTestDataTree_MouseLeftButtonUp" MouseRightButtonUp="ViewTestDataTree_MouseRightButtonUp" Padding="2,2,2,2" Text="{Binding DisplayText}" />
                    <Border Grid.Column="1" Margin="0,0,-2,0" Style="{StaticResource BorderStylePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockPassCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="2" Margin="0,0,-2,0" Style="{StaticResource BorderStyleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockFailCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="3" Margin="0,0,-2,0" Style="{StaticResource BorderStyleModulePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModulePassCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="4" Margin="0,0,-2,0" Style="{StaticResource BorderStyleModuleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModuleFailCountStyleTestData}"/>
                    </Border>
                </Grid>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding TestModuleCategories}" x:Key="level2" ItemTemplate="{StaticResource level3}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="640"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Margin="1,1,1,1" Name="lblDeviceName" MouseLeftButtonUp="ViewTestDataTree_MouseLeftButtonUp" MouseRightButtonUp="ViewTestDataTree_MouseRightButtonUp" ToolTip="{Binding DisplayText}" Style="{StaticResource TreeLabelStyle}" Padding="2,2,2,2" Text="{Binding DisplayText}" />
                    <TextBox Grid.Column="0" Margin="1,1,1,1" Name="DeviceNameTextBox" LostFocus="TextBox_LostFocus" 
                                             Text="{Binding RenameDeviceText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                             PreviewKeyDown="TextBox_PreviewKeyDown"
                                             Padding="2,2,2,2" MaxLength="100" 
                                            Visibility="{Binding Path=Edit, Converter={StaticResource BoolToVisibilityCollapsedConverter}, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
                        <TextBox.CommandBindings>
                            <CommandBinding Command="Paste" CanExecute="CommandBinding_CanExecute"/>
                        </TextBox.CommandBindings>
                    </TextBox>
                    <Border Grid.Column="1" Margin="0,0,-1,0" Style="{StaticResource BorderStylePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockPassCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="2" Margin="0,0,-1,0" Style="{StaticResource BorderStyleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockFailCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="3" Margin="0,0,-1,0" Style="{StaticResource BorderStyleModulePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModulePassCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="4" Margin="0,0,-1,0" Style="{StaticResource BorderStyleModuleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModuleFailCountStyleTestData}"/>
                    </Border>
                </Grid>
            </HierarchicalDataTemplate>

<HierarchicalDataTemplate ItemsSource="{Binding TestRuns}" x:Key="level1" ItemTemplate="{StaticResource level2}" >
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="660"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="130"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Margin="1,1,2,1" Name="lblProjectName" MouseLeftButtonUp="ViewTestDataTree_MouseLeftButtonUp" MouseRightButtonUp="ViewTestDataTree_MouseRightButtonUp" Style="{StaticResource TreeLabelStyle}" Padding="2,2,2,2" Text="{Binding DisplayText}"/>
                    <Border Grid.Column="1" Style="{StaticResource BorderStylePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockPassCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="2" Style="{StaticResource BorderStyleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockFailCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="3" Style="{StaticResource BorderStyleModulePassCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModulePassCountStyleTestData}"/>
                    </Border>
                    <Border Grid.Column="4" Style="{StaticResource BorderStyleModuleFailCountTestData}">
                        <TextBlock Style="{StaticResource TextBlockModuleFailCountStyleTestData}"/>
                    </Border>
                </Grid>
            </HierarchicalDataTemplate>



<TreeView BorderThickness="0" Name="ViewTestDataTree" VirtualizingStackPanel.IsVirtualizing = "True"
                              VirtualizingStackPanel.VirtualizationMode = "Recycling" ItemsSource="{Binding Projects}" Grid.Row="1" 
                              ItemTemplate="{StaticResource level1}"  Background="{StaticResource ATAM_WindowBackground}" FocusVisualStyle="{x:Null}">
                        <TreeView.ItemContainerStyle>
                            <!-- Make the focus highlight rectangle, around the current tree item, barely visible -->
                            <Style TargetType="{x:Type TreeViewItem}">
                                <Style.Resources>
                                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF202020" />
                                    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#FF202020" />
                                </Style.Resources>
                                <Setter Property="IsExpanded" Value="{Binding IsExpanded}"/>
                                <EventSetter Event="TreeViewItem.Expanded" Handler="TreeViewItem_Expanded"/>
                                <EventSetter Event="TreeViewItem.Collapsed" Handler="TreeViewItem_Collapsed"/>
                            </Style>
                        </TreeView.ItemContainerStyle>
                    </TreeView>

Here I had a setter in TreeView.ItemContainerStyle that Setter Property="IsExpanded" Value="{Binding IsExpanded}" but when i set TestStamentList which is level 4 IsExpanded property to True from code then that item is not getting expanded. I want to Expand children with some specific condition on a Button Click(Find Next Button) event.

Note:-I have IsExpanded property on all list levels(4 levels) and i am setting IsExpanded=true of last level list(TestModuleStatementList).

Below is my Button Click Event:

 private void FindNextFailButton_Click(object sender, RoutedEventArgs e)
        {
                foreach (var Project in Projects)
                {
                    foreach (var Devices in Project.TestRuns)
                    {
                        foreach (var Category in Devices.TestModuleCategories)
                        {
                            foreach (var TestModule in Category.TestModules)
                            {
                                foreach (var statement in TestModule.TestModuleStatementList)
                                {
                                    if(statement.ModuleFailed==1)
                                    {
                                        //TreeViewItem item = ViewTestDataTree.ItemContainerGenerator.ContainerFromItem(statement) as TreeViewItem;
                                        //item.IsExpanded = true;
                                        Project.IsExpanded = true;
                                        Devices.IsExpanded = true;
                                        Category.IsExpanded = true;
                                        TestModule.IsExpanded = true;
                                        statement.IsExpanded = true;
                                        statement.IsSelected = true;
                                        return;
                                        //ViewTestDataTree.SelectedItem = statement;
                                    }
                                }

                            }
                        }
                    }
                }
            }
        }

Kindly provide some help

Thanks In Advance.

1
AFAIK you will need to go upt the tree expanding the parents as well. Otherwise it won't show up. In the last element, you will need to call BringIntoView(). I've written a behavior that does it, to keep the MVVM and avoid code-behind. The behavior expands the parent trres and call bringintoview... - Marco
@Marco Thanks for your comment. As i mentioned i want to expand a partilcular node on a button click and I had 4 levels in this tree view. Now i want to expand on a node in 4th level whenever user click a button. I had used setter on this but its not working. Can u provide some working code. - Pankaj Bhatia

1 Answers