Search code examples
wpfmenuitemrouted-events

MenuItem.Click RoutedEvent not firing in WPF


I have a ContextMenu on a DataGrid and I'm trying to capture the MenuItem.Click event for all the menu items. Like so:

<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>

The problem is the event never fires. MenuItem.Click is supposed to be a bubbled event and I should be able to catch it anywhere in the visual tree.

What am I doing wrong?

EDIT: adding the handler in code works fine. The following line in the constructor of the .xaml.cs and all is good.

GridMenu.AddHandler(MenuItem.ClickEvent, new RoutedEventHandler(NewReservationContextMenuClick));

Solution

  • The ContextMenu is opened in a Popup control, which is not part of the visual tree of its logical parent.

    In order to have a common Click handler for all MenuItems, move the handler to the ContextMenu element:

    <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>