我有一个TreeView
,一个ResourceDictionary
,包含一个ContextMenu
,(当前)有一个MenuItem
。 (我将在以后添加更多MenuItem
。)
我正在尝试通过C#代码隐藏为此添加一个事件。我知道想通过代码隐藏而不是仅在XAML中指定代码来执行此操作有点奇怪,但这是我为其他要求所要做的。
所以,我的等级是:
Window
(无名称/密钥)Grid
(无名称/密钥)TreeView
(名为treeView)ContextMenu
(键为allRequirementGroupsMenu)MenuItem
因此,现在我转到后面的代码,可以浏览此层次结构,并可以添加事件处理程序。
是否有更好的方法可以通过代码隐藏来做到这一点?
隐藏代码
var contextmenu = treeView.TryFindResource("allRequirementGroupsMenu") as ContextMenu;
var mnu_create_reqgrp = contextmenu.Items.OfType<MenuItem>()
.FirstOrDefault(item =>
item.Name == "mnuItem_CreateRequirementGroup");
if(mnu_create_reqgrp != null)
mnu_create_reqgrp.Click += RequirementGroup_Create_Click;
XAML
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyApp"
mc:Ignorable="d"
Title="MainWindow" Height="800" Width="1600">
<Grid>
<TreeView x:Name="treeView">
<TreeView.Resources>
<ResourceDictionary>
<ContextMenu x:Key="allRequirementGroupsMenu"
StaysOpen="True">
<MenuItem Header="Create Requirement Group"
Name="mnuItem_CreateRequirementGroup" />
</ContextMenu>
</ResourceDictionary>
</TreeView.Resources>
<TreeViewItem Header="Vendors"
ItemsSource="{Binding Vendors}" />
<TreeViewItem Header="Checklists"
ItemsSource="{Binding Checklists}" />
<TreeViewItem Header="Requirement Groups"
ItemsSource="{Binding RequirementGroups}"
ContextMenu="{StaticResource allRequirementGroupsMenu}" />
<TreeViewItem Header="Ungrouped Items"
ItemsSource="{Binding UngroupedItems}" />
</TreeView>
</Grid>
</Window>