将TreeViewItem的详细信息绑定到ContextMenu

时间:2014-06-09 14:26:51

标签: wpf xaml treeview

我有一个ContextMenu,右键单击TreeViewItem。我现在要做的是将有关TreeViewItem的一些细节传递给上下文菜单。

从这里开始我该怎么做:

XAML

<TreeView x:Class="MyApp.TreeControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300" 
         PreviewMouseLeftButtonDown="TreeView_PreviewMouseLeftButtonDown" 
         PreviewMouseMove="TreeView_PreviewMouseMove" 
         PreviewMouseRightButtonDown="TreeControl_OnPreviewMouseRightButtonDown">
<TreeView.ContextMenu>
    <ContextMenu>
        <MenuItem Name="dataItem1" Header="Property1"></MenuItem>
        <MenuItem Name="dataItem2" Header="Property2"></MenuItem>
        <Separator/>
        <MenuItem Name="taskItem" Header="Tasks" Click="TaskItem_OnClick"></MenuItem>
    </ContextMenu>
</TreeView.ContextMenu>
</TreeView>

我希望将Property1Property2替换为右键单击的TreeViewItem中这些属性的值,类似于:{binding selectedItem.Property1}

代码:(基本上是为了突出显示点击的节点)

private void TreeControl_OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem treeViewItem = VisualUpwardSearch(e.OriginalSource as DependencyObject);

    if (treeViewItem != null)
    {
        treeViewItem.IsSelected = true;
        treeViewItem.Focus();
        e.Handled = true;
    }
}

1 个答案:

答案 0 :(得分:0)

您需要做的第一件事是将MenuItem.Header属性数据绑定到您在ContextMenu.DataContext中设置的对象:

<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={
        RelativeSource Self}}">
    <MenuItem Name="dataItem1" Header="{Binding Property1}"></MenuItem>
    <MenuItem Name="dataItem2" Header="{Binding Property2}"></MenuItem>
    <Separator/>
    <MenuItem Name="taskItem" Header="Tasks" Click="TaskItem_OnClick"></MenuItem>
</ContextMenu>

这是PlacementTarget.Tag是什么,我听你问。查看MSDN上的ContextMenu.PlacementTarget property页面,我们看到它:

  

获取或设置UIElement相对于其打开时所处的位置ContextMenu

简单来说,这只是指应用了ContextMenu的UI元素。现在Tag属性只是object类型的免费属性,我们可以将任何内容放入其中。在您的情况下,我们将ContextMenu.DataContext值放在那里,因为我们无法直接设置它,因为ContextMenu不是一般UI可视化树的一部分:

现在您没有显示将ContextMenu应用于TreeViewItem的代码,但在同一个地方,您需要将Tag属性设置为您的对象想要设置为ContextMenu.DataContext值。因此,我们将其传递到此处,并在ContextMenu中将其取出,如代码示例所示。

有关详细信息,请参阅Stack Overflow上ContextMenu.PlacementTarget is not getting set, no idea whyAdd context menu in datagrid, how to get the select Item value个问题的答案。