Search code examples
c#wpfcontextmenumenuitemitemcontainerstyle

Menu item won't show context menu


I have a button that when clicked, displays a ContextMenu. In this ContextMenu, I have MenuItems. If the MenuItem is left clicked, it should execute a command. All this behavior works properly as of now with the following code:

<Button.ContextMenu>
    <ContextMenu>
        <ContextMenu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                 <Setter Property="Command" Value="{Binding StartContextMenuCommand}" />
                 <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
            </Style>
        </ContextMenu.ItemContainerStyle>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.1}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.2}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.3}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.4}"/>
    </ContextMenu>
</Button.ContextMenu>

Now I want each menu item to have a context menu with one MenuItem. Since left clicking invokes a Command on a MenuItem, I want the right click behavior to display the following ContextMenu:

<ContextMenu>
      <MenuItem Header="Set Default"></MenuItem>
</ContextMenu>

I tried putting this as a setter in the ItemContainerStyle. I also tried putting it as a ContextMenu of a MenuItem, but neither of my attempts, among others have worked. I'm sure I could come up with a hacky way to do this, but I want to keep it clean and simple.


Solution

  • Here's my current fix to this issue, but I don't like it at all. I would like to avoid code behind as much as possible.

    <ContextMenu.ItemContainerStyle>
          <Style TargetType="{x:Type MenuItem}">    
              <Setter Property="Command" Value="{Binding StartCommand}" />
              <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
              <Setter Property="ContextMenu"> 
                 <Setter.Value>
                    <ContextMenu StaysOpen="True">
                        <MenuItem Header="Set As Default"/>
                    </ContextMenu>
                 </Setter.Value>
              </Setter>
              <EventSetter Event="PreviewMouseRightButtonUp" Handler="MenuItem_Click"/>
          </Style>
    </ContextMenu.ItemContainerStyle>
    

    And the code behind:

     private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            ButtonContextMenu.StaysOpen = true;
            (sender as MenuItem).ContextMenu.IsOpen = true;
        }