我有一个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>
我希望将Property1
和Property2
替换为右键单击的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;
}
}
答案 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 why和Add context menu in datagrid, how to get the select Item value个问题的答案。