C# 带绑定子菜单的WPF绑定菜单项

C# 带绑定子菜单的WPF绑定菜单项,c#,wpf,mvvm,menuitem,C#,Wpf,Mvvm,Menuitem,我正在尝试创建一个2层的子菜单,但由于某些原因,第二层不会渲染 XAML: 我的视图模型: public class MenuViewModel<T> : BindableBase { private string _header; private ObservableCollection<MenuViewModel<T>> _subItems; private Action<T> OnClickItem; pr

我正在尝试创建一个2层的子菜单,但由于某些原因,第二层不会渲染

XAML:


我的视图模型:

public class MenuViewModel<T> : BindableBase
{
    private string _header;
    private ObservableCollection<MenuViewModel<T>> _subItems;
    private Action<T> OnClickItem;
    private T ValueItem;

    public MenuViewModel(string header,
        T item,
        Action<T> onClickItem)
        : this(header, item, new List<MenuViewModel<T>>(), onClickItem)
    {

    }
    public MenuViewModel(string header,
        List<MenuViewModel<T>> subItems)
        : this(header, default(T), subItems, obj => { })
    {
    }
    private MenuViewModel(string header,
        T item,
        List<MenuViewModel<T>> subItems,
        Action<T> onClickItem)
    {
        Header = header;
        SubItems = new ObservableCollection<MenuViewModel<T>>(subItems);
        OnClickItem = onClickItem;
        ValueItem = item;
    }

    public string Header
    {
        get { return _header; }
        set { SetProperty(ref _header, value); }
    }

    public ObservableCollection<MenuViewModel<T>> SubItems
    {
        get { return _subItems; }
        set { SetProperty(ref _subItems, value); }
    }

    private ICommand _menuItemCommand;
    public ICommand MenuItemCommand
    {
        get
        {
            if (_menuItemCommand == null)
            {
                _menuItemCommand = new DelegateCommand(() =>
                {
                    OnClickItem(ValueItem);
                });
            }
            return _menuItemCommand;
        }
    }
}
public类MenuViewModel:BindableBase
{
私有字符串_头;
私有可观测集合_子项;
私人行动项目;
私人物品;
公共菜单视图模型(字符串标题,
T项目,
行动(项目)
:此(标题、项、新列表()、onClickItem)
{
}
公共菜单视图模型(字符串标题,
(列出分项)
:this(头,默认值(T),子项,obj=>{})
{
}
私有菜单视图模型(字符串头,
T项目,
列出分项,
行动(项目)
{
页眉=页眉;
子项=新的可观测集合(子项);
OnClickItem=OnClickItem;
ValueItem=项目;
}
公共字符串头
{
获取{return_header;}
set{SetProperty(ref_头,值);}
}
公共可观测集合子项
{
获取{return\u subItems;}
set{SetProperty(ref_子项,值);}
}
专用ICommand _menuItemCommand;
公共ICommand菜单项命令
{
得到
{
如果(_menuItemCommand==null)
{
_menuItemCommand=新的DelegateCommand(()=>
{
OnClickItem(ValueItem);
});
}
返回_menuItemCommand;
}
}
}
GraphMenuItems属性的值:

GraphMenuItems = new ObservableCollection<MenuViewModel<string>>(new List<MenuViewModel<string>>()
{
    new MenuViewModel<string>("LAeq reading", "LAeg", OnMinorGraphSettingsChanged),
    new MenuViewModel<string>("Octave band 1/1", new List<MenuViewModel<string>>()
    {
        new MenuViewModel<string>("16 Hz", "1-1-Hz16",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("31.5 Hz", "1-1-Hz31_5",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("16 Hz", "1-1-Hz16",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("63 Hz", "1-1-Hz63",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("125 Hz", "1-1-Hz125",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("250 Hz", "1-1-Hz250",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("500 Hz", "1-1-Hz500",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("1000 Hz", "1-1-Hz1000",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("2000 Hz", "1-1-Hz2000",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("4000 Hz", "1-1-Hz4000",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("8000 Hz", "1-1-Hz8000",  OnMinorGraphSettingsChanged),
        new MenuViewModel<string>("16000 Hz", "1-1-Hz16000",  OnMinorGraphSettingsChanged)
    })
});
graphmentuitems=新的可观察集合(新列表()
{
新的菜单视图模型(“LAeq读数”、“LAeg”、无符号图形设置更改),
新菜单视图模型(“倍频带1/1”,新列表()
{
新MenuViewModel(“16 Hz”,“1-1-Hz16”,无符号设置更改),
新的Menuview模型(“31.5 Hz”,“1-1-Hz31_5”,无人机设置更改),
新MenuViewModel(“16 Hz”,“1-1-Hz16”,无符号设置更改),
新的Menuview模型(“63 Hz”,“1-1-Hz63”,无符号设置更改),
新MenuViewModel(“125 Hz”,“1-1-Hz125”,无符号设置更改),
新的Menuview模型(“250 Hz”,“1-1-Hz250”,无符号设置更改),
新MenuViewModel(“500 Hz”,“1-1-Hz500”,无符号设置更改),
新的Menuview模型(“1000 Hz”,“1-1-Hz1000”,不规则图形设置更改),
新的Menuview模型(“2000 Hz”,“1-1-Hz2000”,无符号设置更改),
新的Menuview模型(“4000 Hz”,“1-1-Hz4000”,不规则图形设置更改),
新的Menuview模型(“8000 Hz”,“1-1-Hz8000”,无符号设置更改),
新菜单视图模型(“16000 Hz”,“1-1-Hz16000”,未经修改的图像设置)
})
});
目前的结果是:

不要在
项目模板中添加
MenuItem
元素。有一个
MenuItem
元素为
ItemsSource
中的每个项目隐式生成。您应该将
ItemTemplate
设置为
hierarchycaldatatemplate

试试这个:

<Menu>
    <Menu.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding MenuItemCommand}" />
        </Style>
    </Menu.Resources>
    <MenuItem Header="Minor Graph" ItemsSource="{Binding GraphMenuItems}">
        <MenuItem.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding SubItems}">
                <TextBlock Text="{Binding Header}" />
            </HierarchicalDataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>

请记住投票选出有用的答案:)
<Menu>
    <Menu.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding MenuItemCommand}" />
        </Style>
    </Menu.Resources>
    <MenuItem Header="Minor Graph" ItemsSource="{Binding GraphMenuItems}">
        <MenuItem.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding SubItems}">
                <TextBlock Text="{Binding Header}" />
            </HierarchicalDataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>