C# wpftreeview上的类型

C# wpftreeview上的类型,c#,wpf,treeview,C#,Wpf,Treeview,我有三个标签之一的树状视图。其他两个选项卡包含列表框。 树视图有父视图和子视图,只有两层。(不确定此处的术语是否正确) 当用户单击Treeview中的某个项目时,会出现一个带有New/Edit/Delete选项的上下文菜单。 由于其他两个选项卡使用相同的Contextmenu,因此它以特定的方式实现。这是它的背景。 父项的类型为TemplateFamily,子项的类型为TemplateParameter。 我使用标签发送额外的信息,以便知道请求来自哪个标签 以下是选项卡项的wpf: <Ta

我有三个标签之一的树状视图。其他两个选项卡包含列表框。 树视图有父视图和子视图,只有两层。(不确定此处的术语是否正确)

当用户单击Treeview中的某个项目时,会出现一个带有New/Edit/Delete选项的上下文菜单。 由于其他两个选项卡使用相同的Contextmenu,因此它以特定的方式实现。这是它的背景。 父项的类型为TemplateFamily,子项的类型为TemplateParameter。 我使用标签发送额外的信息,以便知道请求来自哪个标签

以下是选项卡项的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>
所以我的问题是,单击并选择新选项时,如何获取父项的类型(编辑和删除目前影响不大)?
实际上,即使用户单击一个子项,我也只需要将父项强制转换为TemplateFamily来实现功能。

ViewModel应该完全不了解UI方面的问题。NewFile将
FrameworkElement
作为参数的事实是一个巨大的危险信号。什么是TemplateFamilyList?您的类型是如何定义的?顺便说一句,我无法重现您的问题。我从第二次强制转换(在'else'分支中)得到一个非空结果。所以我想你的代码中还有一些我们在这里看不到的东西。然而,正如@LynnCrumbling正确地提到的,您的方法违反了MVVM。关于如何正确实现MVVM的建议可能更合适:@mm8,ObservableCollection TemplateFamilyList。当您询问如何定义我的类型时,我不确定您想要什么。
<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>
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;
        }

    }