MenuCollection绑定两次MVVM +数据绑定子菜单项

时间:2017-04-03 14:23:31

标签: c# wpf xaml data-binding menuitem

如下图所示,您可以看到2个悬停状态。这是XAML

<Menu ItemsSource="{Binding Data.MenuCollection}">
    <Menu.ItemTemplate >
        <DataTemplate DataType="MenuItem">
            <MenuItem Header="{Binding Header}" Command="{Binding Command}" ItemsSource="{Binding Children}"/>
        </DataTemplate>
    </Menu.ItemTemplate>
</Menu>

数据集合在标题上工作。但是我无法显示Children节点。

public void CreateTempMenuList()
{
    MenuCollection = new ObservableCollection<MenuItem>()
    {
        new MenuItem()
        {
            Header = "File",
            Children = new ObservableCollection<MenuItem>()
            {
                new MenuItem()
                {
                    Header = "Exit"
                }
            }
        }
    };
}

MenuItem类是我创建的。每个属性都有一个调用OnPropertiesChanged函数的setter。如果需要,我可以添加该类,但我很确定这不是问题。

所以我的问题是。我如何摆脱'double' hover。在图片中,您可以看到2 borders。我悬停在outer border上方。悬停一直持续到专注于别的东西。

我的第二个问题是我怎样才能让儿童用品上班? itemssource标签上的menuitem可能是错误的,但我想到的就是它。

enter image description here

2 个答案:

答案 0 :(得分:1)

定义HierarchicalDataTemplate

<Menu ItemsSource="{Binding Data.MenuCollection}">
    <Menu.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding Command}" />
        </Style>
    </Menu.Resources>
    <Menu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Header}" />
        </HierarchicalDataTemplate>
    </Menu.ItemTemplate>
</Menu>

为每个项隐式创建System.Windows.Controls.MenuItem容器,因此您不应在模板中添加另一个MenuItem元素。

另请确保您不绑定ObservableCollection<System.Windows.Controls.MenuItem>,因为ItemTemplate不会应用于内置MenuItem元素。

答案 1 :(得分:0)

要使当前代码生效,请右键单击Menu control > Edit Additional Template > Edit ItemContainerStyle > Edit Copy

在生成的Style中,

搜索这段代码:

           <Trigger Property="Role" Value="TopLevelItem">
                <Setter Property="Padding" Value="7,2,8,3"/>
                <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/>
            </Trigger>

Padding更改为0而不是7,2,8,3