为WPF TreeViews定义上下文菜单

时间:2010-06-02 12:58:04

标签: wpf treeview contextmenu

我已经为我的WPF TreeView提供了一个上下文菜单:

<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_ContextMenuOpening事件处理程序中),但问题是右键单击树视图项打开该树视图的上下文菜单,不用更改树视图项的选定状态。

另外,我不禁想到以上所有内容都非常类似于WPF,所以:

  • 如何设置,以便当用户右键单击树视图项时,该项被选中。
  • 是否有更好的方法来实现上述目标?

1 个答案:

答案 0 :(得分:0)

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

private bool CanExcute()
{
    if (MyTreeView.SelectedItem != null)
       return true;
    else
       return false;
}

通过这样做,只有在选择了一个项目之后,才会启用remove命令。否则其菜单项将被禁用。