MenuItem.Click RoutedEvent未在WPF中触发

时间:2012-06-09 05:25:50

标签: wpf menuitem routed-events

我在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));

2 个答案:

答案 0 :(得分:3)

ContextMenuPopup控件中打开,该控件不属于其逻辑父级的可视树。

要为所有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>
相关问题