MenuItem.Header 和 MenuItem.Icon 数据模板

MenuItem.Header and MenuItem.Icon DataTemplate

我有一个包含以下两个菜单项的菜单:

<MenuItem Header="Item1">
  <MenuItem.Icon>
    <cc:Icon ImageSource="..." Size="22"/>
  </MenuItem.Icon>
</MenuItem>
<MenuItem Header="Item2">
  <MenuItem.Icon>
    <cc:Icon ImageSource="..." Size="22"/>
  </MenuItem.Icon>
</MenuItem>

如您所见,每个项目都有一个名称 "Header" 和一个图标(我自己的控件)作为 "Icon"。

我不想在 XAML 中显式写入它们,而是想将 ItemsSource 绑定到我的 ViewModel 中的 List<MenuItem> object,如下所示:

ItemsSource="{Binding Path=SomeMenu}"

我的 MenuItem class 有字段 "String Name" 和 ImageSource Icon 我想绑定到 Header 和 Icon 部分我的菜单项完全我在这里是怎么做的。

我认为正确的方法是使用 DataTemplate,像这样:

<Menu.ItemTemplate>
  <DataTemplate>
    <!-- TODO: Bind the Header and Icon properties-->
    <TextBlock Text="{Binding Path=Name}"/>
    <!-- how to bind the icon? -->
  </DataTemplate>
<Menu.ItemTemplate>

但我不明白如何分别定义 Header 和 Icon 模板。

我该怎么做呢?

更新: 我希望 <cc:Icon> 出现在 menuItem 模板中任何有 <contentPresenter Source="Icon">textBox 出现的地方有一个<contentPresenter Source="Header">

我相信这就是你想要的:

<Menu ItemsSource="{Binding SomeMenu}">
        <Menu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="Icon">
                    <Setter.Value>
                        <cc:Icon Source="{Binding Icon}"></Image>
                    </Setter.Value>
                </Setter>
                <Setter Property="Header" Value="{Binding Name}"/>
            </Style>
        </Menu.ItemContainerStyle>    
</Menu>

还是我又惨败了? :)