Подменю WPF для контекстного меню

Если контекстное меню "жестко закодировано" в xaml, то легко добавить подменю. Например:

<ContextMenu>
    <MenuItem Header="Comm1" Command="{Binding Blabla1}">
        <MenuItem Header="SubComm1" Command="{Binding Blabla2}"></MenuItem>
    </MenuItem>
    <MenuItem Command="Comm2"></MenuItem>
    <MenuItem Command="Comm3"></MenuItem>
</ContextMenu>

Это означает, что ContextMenu имеет три элемента (Comm1, Comm2 и Comm3), а Comm1 имеет подменю Submenu1.

Я сделал свой ContextMenu немного более гибким:

<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter>
            <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter>
        </Style>
     </ContextMenu.ItemContainerStyle>
</ContextMenu>

в основном я могу иметь любое количество элементов в ContextMenu, и любой элемент может иметь любую команду. Как добавить подменю в элемент ContextMenu?

1 ответов


вы можете установить MenuItem.ItemsSource во вложенную коллекцию. Это создаст подменю для любого menuitem. Для этого модель, поддерживающая ваш MenuItem, должна иметь коллекцию submenuitems в нем

<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="ItemsSource" Value="{Binding ContextMenuSubItems}"></Setter>
            <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter>
            <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter>
        </Style>
     </ContextMenu.ItemContainerStyle>
</ContextMenu>

аналогично вы можете установить MenuItem.ItemContainerStyle и MenuItem.ItemTemplate стиль ваших submenuitems.