xaml - MVVM 的 WPF MenuItem 模板

标签 xaml mvvm datatemplate

我在编写 xaml 表示以允许绑定(bind)到我的背景 ViewModel 以进行级联菜单时遇到问题

这是虚拟机:

public class MenuNode
{
  public string Header {get;}
  public List<MenuNode> Items {get;}
}

我拥有的 xaml 是这样的:
<ContextMenu ItemsSource="{Binding Choices}" >
    <ContextMenu.Resources>
        <DataTemplate DataType="{x:Type vmi:MenuNode}">
            <MenuItem Header="{Binding Header}" ItemsSource="{Binding Items}"/>
        </DataTemplate> 
    </ContextMenu.Resources>
</ContextMenu>

当菜单弹出时,我得到带有箭头的第一级条目(表示应该有一个子菜单),但是当我将鼠标悬停在菜单上时,它不显示子菜单项。

有任何想法吗?

最佳答案

好的,问题来了:

出于某种原因,MenuItems由您的DataTemplate 生成正在被另一个 MenuItem 包裹起来(结果是嵌套的 MenuItems )。子项未打开,因为外部 MenuItem没有 child 。

解决方案是使用 HierarchicalDataTemplate反而:

<ContextMenu ItemsSource="{Binding Choices}" >
    <ContextMenu.Resources>
        <HierarchicalDataTemplate DataType="{x:Type vmi:MenuNode}" ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Header}"/>
        </HierarchicalDataTemplate> 
    </ContextMenu.Resources>
</ContextMenu>

关于xaml - MVVM 的 WPF MenuItem 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5585594/

相关文章:

c# - 根据类型选择数据模板

javascript - 将选定的记录加载到模态窗口

android - 如何通过 Android/Kotlin App 上的 Koin 注入(inject)在 BaseActivity 中初始化/注入(inject)通用 ViewModel

c# - 如何在 MVVM-WPF 中获取选定的项目

wpf - WPF/MVVM/Prism中菜单按钮的实现

WPF - 刷新数据模板的内容

c# - 如何在运行时将动态资源分配给 WPF 代码中的按钮

带有圆角的 WPF 超链接图像

c# - slider 大小变化

c# - WPF:为什么使用多个 WindowsFormsHost 时 UI 变得迟缓?