为WPF TreeView定义上下文菜单

为WPF TreeView定义上下文菜单,wpf,treeview,contextmenu,Wpf,Treeview,Contextmenu,我已经给了我的WPF树视图一个上下文菜单: <TreeView ContextMenuOpening="TreeView_ContextMenuOpening"> <TreeView.ContextMenu> <ContextMenu> <MenuItem Name="NewInputMenuItem" Header="Add" Click="AddInputMenuItem_Click" />

我已经给了我的WPF树视图一个上下文菜单:

<TreeView ContextMenuOpening="TreeView_ContextMenuOpening">
    <TreeView.ContextMenu>
        <ContextMenu>
            <MenuItem Name="NewInputMenuItem" Header="Add" Click="AddInputMenuItem_Click" />
            <MenuItem Name="RemoveInputMenuItem" Header="Remove" Click="RemoveInputMenuItem_Click" />
        </ContextMenu>
    </TreeView.ContextMenu>
    <!-- etc... -->
</TreeView>

我在
TreeView
上定义了上下文菜单,而不是在
TreeViewItem
上定义了上下文菜单,因为无论是否选择某个项目,我都希望显示相同的上下文菜单,但是我确实希望仅当用户右键单击某个项目时才启用“删除”菜单项,而不仅仅是在菜单中的空白处

我目前处理这个问题的方法是使用
TreeView
(在
TreeView\u ContextMenuOpening
事件处理程序中)的selected item属性,但问题是右键单击树视图项会打开该树视图的上下文菜单,而不会更改树视图项的选定状态

此外,我忍不住认为上述所有内容都与WPF非常相似,因此:

  • 如何使其在用户右键单击树状视图项目时处于选中状态
  • 有没有更好的方法实现上述目标

    • WPF命令在这种情况下非常有用。我想你最好把每个菜单项都绑定到一个命令上。这样,您可以在每个命令中定义何时可以执行此命令。WPF自动检查每个命令是否可以在运行时执行。如果不允许执行其中任何命令,则该命令的绑定控件将自动禁用。在这里,您可以使用此示例代码作为treeview的remove命令的CanExcute方法:

      private bool CanExcute()
      {
          if (MyTreeView.SelectedItem != null)
             return true;
          else
             return false;
      }
      
      通过执行此操作,只有在选择项目后,才会启用“删除”命令。否则,其菜单项将被禁用