首页 > 解决方案 > WPF TreeView 上的类型

问题描述

我在三个选项卡之一上有一个 Treeview。其他两个选项卡包含列表框。Treeview 有父母和孩子,只有两层。(不确定此处的术语是否正确)。

当用户单击 Treeview 中的项目时,会有一个带有新建/编辑/删除选项的上下文菜单。由于其他两个选项卡使用相同的上下文菜单,它已以特定方式实现。是它的背景。父级具有 TemplateFamily 类型,子级具有 TemplateParameter 类型。我使用标签发送额外信息,以便我知道请求来自哪个选项卡。

这是 TabItem 的 wpf:

<TabItem Header="Template Files" Height="22" VerticalAlignment="Top">
            <TreeView ItemsSource="{Binding TemplateFamilyList}" 
                      Margin="20"
                      ContextMenu="{StaticResource NewEditDeleteContextMenu}"
                      Tag="{x:Type domain:TemplateParameter}">
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type helper:TemplateFamily}"
                              ItemsSource="{Binding TemplateParameterMembers}" >
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Template.Name}" />
                            <TextBlock Text=" [" Foreground="Blue" />
                            <TextBlock Text="{Binding TemplateParameterMembers.Count}" Foreground="Blue" />
                            <TextBlock Text="]" Foreground="Blue" />
                        </StackPanel>
                        <HierarchicalDataTemplate.ItemContainerStyle>
                            <Style TargetType="{x:Type TreeViewItem}">
                                <EventSetter Event="MouseDoubleClick" Handler="TemplateParameterListBox_MouseDoubleClick"/>
                            </Style>
                        </HierarchicalDataTemplate.ItemContainerStyle>
                    </HierarchicalDataTemplate>
                    <DataTemplate DataType="{x:Type domain:TemplateParameter}">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Name}" />
                            <TextBlock Text=" (" />
                            <TextBlock Text="{Binding ParameterID}" />
                            <TextBlock Text=" ; " />
                            <TextBlock Text="{Binding Sequence}" />
                            <TextBlock Text=")" />
                        </StackPanel>
                    </DataTemplate>
                </TreeView.Resources>
            </TreeView>
        </TabItem>

这是上下文菜单:

<ContextMenu x:Key="NewEditDeleteContextMenu"
                 DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
        <MenuItem Header="New" 
                  Command="{Binding DataContext.NewFileCommand}"  
                  CommandParameter="{Binding}"/>
        <MenuItem Header="Edit" 
                  Command="{Binding DataContext.EditFileCommand}"  
                  CommandParameter="{Binding SelectedItem}"/>
        <MenuItem Header="Delete" 
                  Command="{Binding DataContext.DeleteFileCommand}"  
                  CommandParameter="{Binding SelectedItem}"/>
    </ContextMenu>

因此,当用户右键单击子节点(TemplateParameter)时,一切都很好,但是当用户单击父节点(TemplateFamily)时,下面的作为 TemplateParameter 的转换不起作用,selectedTemplateParameter为 null 并且在 else声明也不起作用。

在 ViewModel 我有这个:

public void NewFile(FrameworkElement frameworkElement)
    {

        System.Windows.Controls.TreeView treeView = frameworkElement as System.Windows.Controls.TreeView;              
        TemplateParameter selectedTemplateParameter = treeView.SelectedItem as TemplateParameter;

        if (selectedTemplateParameter != null)
        {
        ...
        }
        else
        {
            TemplateFamily templatefam = treeView.SelectedItem as TemplateFamily;
        }

    }

所以我的问题是,如何在单击并选择新选项时获取父类型(编辑和删除目前影响不大)?实际上,即使用户点击了一个孩子,我也只需要将父级转换为 TemplateFamily 即可完成该功能。

标签: c#wpftreeview

解决方案


推荐阅读