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