我有以下代码:
<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>
我希望得到(当我对菜单项进行硬编码时会得到类似的内容):
我得到的是:
我做错了什么?
答案 0 :(得分:3)
您可能希望使用ItemContainerStyle
代替DataTemplate
。您必须设置数据项容器的样式,而不仅仅是为数据项提供模板。
使用DataTemplate
,您基本上将另一个嵌套的MenuItem显示为为菜单 Something 生成的每个MenuItem的内容,并且您的内部MenuItem将图像放在正确的位置。我在这里附上了Snoop的VisualTree供你参考。
下面是数据项容器的样式(在本例中为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,此处添加了图像
应用上述样式后,菜单的外观如下:
请参阅this MSDN页面,详细了解ItemContainerStyle
。
答案 1 :(得分:1)
所以,sthotakura的回答让我走上正轨,但是他发布的代码并没有完全奏效,因为风格也适用于父菜单项。
如果其他人遇到类似的问题并且在这个问题上遇到麻烦,这里的代码就是:
<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>