使用复合集合 "doubling" 向上填充 MenuItem

Populating MenuItem with composite collection "doubling" up

我正在尝试用一组子项填充菜单项。这很容易,但是我需要添加一个始终存在的额外内容来执行 "add" 操作。我使用复合集合将其添加到需要显示的现有项目集合中。

代码如下:

<MenuItem Header="Time Ranges" x:Name="TimeRangesMenuItem"
        Background="{StaticResource TitleBarButtonBackgroundBrush}"
        Margin="2">
    <MenuItem.Resources>
        <CollectionViewSource Source="{Binding ElementName=TimeRangesMenuItem, Path=DataContext.TimeSpans}" x:Key="TimeSpanMenuItems" />
    </MenuItem.Resources>
    <MenuItem.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding Source={StaticResource TimeSpanMenuItems}}" />
            <Separator />
            <MenuItem Header="Add New" cal:Message.Attach="NewTimeSpan()" />
        </CompositeCollection>
    </MenuItem.ItemsSource>
    <MenuItem.ItemTemplate>
        <ItemContainerTemplate>
            <MenuItem Header="{Binding Name}" cal:Message.Attach="ConfigureTimeSpan()" />
        </ItemContainerTemplate>
    </MenuItem.ItemTemplate>
</MenuItem>

几乎可以。我试图显示的 DataContext.TimeSpans ViewModel 是 "nested" 在两个 MenuItems 中,而不是仅仅填充一个,所以我得到了这种奇怪的行为(这只有一个 TimeSpanViewModel "Time Span":

鼠标在 "inner" 菜单项之外。请注意,如果按下它,内部的功能将起作用:

普通菜单项:

有人知道如何解决这个问题吗?

什么是项目ItemContainerTemplate...

我认为您想改为操纵 MenuItem.ItemContainerStyle,否则您会创建两个 MenuItems


MenuItem.ItemTemplate 已经定义了给定项目容器内的内容(因控件而异,这里 MenuItem,在 ComboBox 中是 ComboBoxItem,等等) .由于在 MenuItem 上似乎没有 ItemContainerTemplate 属性,您可能只能以这种方式使用它来实现选择器 returns 您的模板并将其设置为 ItemContainerTemplateSelector.