【问题标题】:Command doesn't work on top level MenuItem in MVVM命令不适用于 MVVM 中的顶级 MenuItem
【发布时间】:2015-06-29 13:51:14
【问题描述】:

如果MenuItem没有子MenuItem也可以,像这样:

<MenuItem Header="Open" Command="{Binding OpenCommand}"/>

但是,当我向其中添加子 MenuItem 时,命令不起作用:

<MenuItem Header="Open" Command="{Binding OpenCommand}">
    <MenuItem />
</MenuItem>

点击事件也不能这样工作:

<MenuItem Header="Open" Click="MenuItem_Click">
    <MenuItem />
</MenuItem>

当我尝试将命令添加到标题时:

<MenuItem>
    <MenuItem.Header>
        <TextBlock>
            <TextBlock.InputBindings>
                 <MouseBinding Gesture="LeftClick" Command="{Binding OpenCommand}"/>
            </TextBlock.InputBindings>
            Open
        </TextBlock>
    </MenuItem.Header>
    <MenuItem />
</MenuItem>

命令有效,但子菜单项不显示。

任何帮助将不胜感激,并原谅我半生不熟的英语。

【问题讨论】:

    标签: wpf mvvm binding command menuitem


    【解决方案1】:

    如果您有子MenuItems,则使用点击事件(用户期望)显示子菜单。要对子菜单打开做出反应,请使用事件SubmenuOpened

    如果你真的希望能够打开一个子菜单并点击“打开”,你可以使用这个sniper,但我真的不建议这样做:

    <MenuItem SubmenuOpened="MenuItem_OnSubmenuOpened"> <!-- handle sub menu opening if desired -->
      <MenuItem.Header>
        <Button Click="Button_Click">Open V2</Button> <!-- handle click on "Open" if desired; doesn't open sub menu! -->
      </MenuItem.Header>
      <MenuItem />
    </MenuItem>
    

    请注意,我已经在“打开”不是顶级菜单项的情况下对此进行了测试。

    【讨论】:

    • 感谢您的回答。我想在子菜单打开之前刷新一些东西,但似乎没有SubmenuOpening 事件。我终于解决了这个问题:&lt;MenuItem Header = "Open" MouseEnter="MenuItem_MouseEnter"&gt;。再次感谢您。
    • @Chao:您还可以通过使用MenuItem.Items 属性上的绑定来动态生成菜单。在每次菜单打开时都会调用的 getter 中(或者您可以引发属性更改事件),因此您可以修改内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多