WPF中的MenuItem.Click路由事件没有触发

3

我在一个 DataGrid 上有一个 ContextMenu,我尝试捕获所有菜单项的 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));

请注意,在代码中,您将处理程序添加到ContextMenu本身,而不是DataGrid。因此,行为没有区别。 - EvAlex
首先从DataGrid中查找MenuItem是否在VisualTree中... 如果存在,它应该触发。 - David Bekham
2个回答

4
< p > ContextMenu 在一个 Popup 控件中打开,而该控件不是其逻辑父级的一部分。

为了拥有所有 MenuItems 的共同 Click 处理程序,将处理程序移动到 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>

2
您还可以使用样式为所有 MenuItem 分配事件处理程序:

<DataGrid.Resources>
    <Style TargetType="{x:Type MenuItem}">
        <EventSetter Event="Click" Handler="NewReservationContextMenuClick" />
    </Style>
</DataGrid.Resources>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接