【问题标题】:WPF Multilevel TreeView Expanding IssueWPF 多级 TreeView 扩展问题
【发布时间】:2018-03-06 06:30:46
【问题描述】:

我有一个多达 4 个级别的多级 TreeView,如下所示:

 <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>

在这里,我在 TreeView.ItemContainerStyle 中有一个设置器 Setter Property="IsExpanded" Value="{Binding IsExpanded}" 但是当我设置 TestStamentList 时,它是第 4 级从代码中将 IsExpanded 属性设置为 True,则该项目不会被扩展。我想在 Button Click(Find Next Button) 事件中展开具有某些特定条件的子项。

注意:-我在所有列表级别(4 个级别)上都有 IsExpanded 属性,并且我正在设置最后一级列表(TestModuleStatementList)的 IsExpanded=true。

下面是我的按钮点击事件:

 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;
                                    }
                                }

                            }
                        }
                    }
                }
            }
        }

请提供一些帮助

提前致谢。

【问题讨论】:

  • AFAIK 你也需要爬上树来扩展父母。否则不会出现。在最后一个元素中,您需要调用 BringIntoView()。我已经编写了一个行为,以保留 MVVM 并避免代码隐藏。该行为扩展父 trres 并调用 Bringintoview...
  • @Marco 感谢您的评论。正如我提到的,我想在单击按钮时展开一个特定的节点,我在这个树视图中有 4 个级别。现在,每当用户单击按钮时,我都想在第 4 级扩展节点。我曾在此使用过 setter,但它不起作用。你能提供一些工作代码吗?

标签: c# wpf


【解决方案1】:

我将其发布为答案,因为我无法在评论中标记已解决。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/how-to-find-a-treeviewitem-in-a-treeview

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多