我在ContextMenu
上有DataGrid
,我正在尝试捕获所有菜单项的MenuItem.Click
事件。像这样:
<DataGrid Name="dataGridMembers" Grid.Row="1" Grid.ColumnSpan="15"
AutoGenerateColumns="False" SelectionMode="Single"
ItemsSource="{Binding MemberList}" RowHeaderWidth="5"
MouseDoubleClick="dataGridMembers_MouseDoubleClick"
MenuItem.Click="NewReservationContextMenuClick">
<DataGrid.ContextMenu>
<ContextMenu Name="GridMenu">
<MenuItem
Name="AddSponsoredSingle"
Header="Add Sponsored Single" />
<Separator />
<MenuItem
Name="EditNote"
Header="Add/Edit Note" />
<Separator />
<MenuItem
Name="AddMale"
Header="Add Male" />
<MenuItem
Name="AddFemale"
Header="Add Female"/>
<MenuItem
Name="AddCouple"
Header="Add Couple"/>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>
问题是事件永远不会发生。 MenuItem.Click
应该是一个冒泡的事件,我应该能够在视觉树中的任何地方捕获它。
我做错了什么?
编辑:在代码中添加处理程序工作正常。 .xaml.cs
的构造函数中的以下行都很好。
GridMenu.AddHandler(MenuItem.ClickEvent, new RoutedEventHandler(NewReservationContextMenuClick));
答案 0 :(得分:3)
ContextMenu
在Popup
控件中打开,该控件不属于其逻辑父级的可视树。
要为所有Click
设置一个公共MenuItems
处理程序,请将处理程序移至ContextMenu
元素:
<DataGrid Name="dataGridMembers" Grid.Row="1" Grid.ColumnSpan="15"
AutoGenerateColumns="False" SelectionMode="Single"
ItemsSource="{Binding MemberList}" RowHeaderWidth="5"
MouseDoubleClick="dataGridMembers_MouseDoubleClick"
>
<DataGrid.ContextMenu>
<ContextMenu Name="GridMenu"
MenuItem.Click="NewReservationContextMenuClick">
...
</ContextMenu>
答案 1 :(得分:2)
您还可以使用所有MenuItem
的样式来分配事件处理程序:
<DataGrid.Resources>
<Style TargetType="{x:Type MenuItem}">
<EventSetter Event="Click" Handler="NewReservationContextMenuClick" />
</Style>
</DataGrid.Resources>