c# - 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 即可完成该功能。
解决方案
推荐阅读
- php - 使用正则表达式分解逗号分隔的字符串
- flyway - flyway.initSql中的多条SQL语句
- database - 如何正确设计数据库,单个对象与多个关系
- google-cloud-platform - Google AutoML 翻译 - 冷启动
- flutter - 如何将字符串列表存储到 Firestore?
- git - VSCode 中的活动更改过多
- julia - 贝叶斯 ODE 与 Julia
- java - 如何在 Spring Boot 中检索 url 并在 Angular 中使用它?
- firebase - Firebase 您的 Cloud Firestore 数据库对基本安全规则有不安全的规则
- mongoexport - 使用 mongoexport 从特定时间范围内使用查询和时间戳从 mongodb 导出数据