0

我有以下代码:

<Menu>
    <MenuItem ItemsSource="{Binding SomethingMenuItems}" Header="Something"/>
</Menu>

其中MenuItems 是SomethingMenuItem 类型的对象的集合。

我也有:

<DataTemplate DataType="{x:Type SomethingMenuItem}">
    <MenuItem Header="{Binding OrderTypeName}">
        <MenuItem.Icon>
            <Image Source="{Binding IconName}"/>
        </MenuItem.Icon>
    </MenuItem>
</DataTemplate>

我希望得到(当我对菜单项进行硬编码时会得到类似的东西):

在此处输入图像描述

我得到的是:

在此处输入图像描述

我究竟做错了什么?

4

2 回答 2

3

您可能想要使用ItemContainerStyle而不是DataTemplate. 您必须为数据项的容器设置样式,而不仅仅是为数据项提供模板。

使用您的,您基本上将另一个嵌套的 MenuItem 显示为为您的 Menu SomethingDataTemplate生成的每个 MenuItem 的内容,并且您的内部 MenuItem 将图像放在正确的位置。我在这里附上 Snoop 的 VisualTree 供您参考。

嵌套菜单项

以下是数据项容器的样式(在本例中为 a MenuItem):

<MenuItem ItemsSource="{Binding SomethingMenuItems}" 
          Header="Something">
    <MenuItem.Resources>
        <Image Source="{Binding IconPath}" x:Key="IconImage" x:Shared="False"/>
        <Style TargetType="MenuItem" >
            <Setter Property="Header" Value="{Binding Name}" />
            <Setter Property="Icon" Value="{StaticResource IconImage}" />
        </Style>
    </MenuItem.Resources>
</MenuItem>

应用上述样式时,您看不到嵌套的 MenuItems,在此处添加了图像 没有嵌套的菜单项

应用上述样式后,菜单的外观如下:

容器样式后的菜单

请参阅MSDN 页面以了解有关ItemContainerStyle.

于 2013-11-14T00:48:05.333 回答
1

So, sthotakura's answer set me on the right track, but the code he posted didn't quite work because the style got applied to the parent menuitem as well.

In case someone else has a similar problem and stumbles on this question, here's the code that works:

<MenuItem ItemsSource="{Binding SomethingMenuItems}" 
          Header="Something">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem" >
            <Style.Resources>
                <Image Source="{Binding IconPath}" x:Key="IconImage" x:Shared="False"/>
            </Style.Resources>
            <Setter Property="Header" Value="{Binding Name}" />
            <Setter Property="Icon" Value="{StaticResource IconImage}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>
于 2013-11-14T18:06:00.130 回答