Пункт меню не показывает контекстное меню

У меня есть кнопка, которая при нажатии отображает ContextMenu. В этом ContextMenu у меня есть MenuItems. Если MenuItem щелкнуть левой кнопкой мыши, он должен выполнить команду. Все это поведение работает должным образом с помощью следующего кода:

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

Теперь я хочу, чтобы у каждого пункта меню было контекстное меню с одним MenuItem. Поскольку при щелчке левой кнопкой мыши вызывается команда в MenuItem, я хочу, чтобы при щелчке правой кнопкой мыши отображалось следующее ContextMenu:

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

Я попытался поместить это как сеттер в ItemContainerStyle. Я также попытался поместить его в качестве ContextMenu для MenuItem, но ни одна из моих попыток, среди прочего, не сработала. Я уверен, что мог бы придумать хакерский способ сделать это, но я хочу сохранить его в чистоте и простоте.

2 ответа

Решение

Вот мое текущее решение этой проблемы, но мне оно совсем не нравится. Я хотел бы избежать кода позади как можно больше.

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

И код позади:

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

Может быть, я не понимаю ваш вопрос (мой английский не... ничего особенного):D Но это должно сработать, если вы просто хотите многоуровневое contextmenu:

<ContextMenu>
    <MenuItem Header="Top Level 1">
        <MenuItem Header="Sub Level" />
        <MenuItem Header="Sub Level" />
    </MenuItem>
    <MenuItem Header="Top Level 2">
        <MenuItem Header="Sub Level" />
        <MenuItem Header="Sub Level" />
    </MenuItem>
</ContextMenu>
Другие вопросы по тегам