我有一个TreeView,它具有几个不同的DataTemplates和HierarchicalDataTemplates。它基本上是一些软件设置的简单直观表示,并具有动态添加/删除/编辑设置的功能。 TreeView的DataContext设置为整体用户控制VM,其中包含TreeView的ItemsSource以及用于对项目执行操作的命令。
TreeView在其资源中有一些不同的上下文菜单(基本上,不同的项目类型可能不会使用相同的上下文菜单),但是问题是全面的。我已经将其设置为将ContextMenu的DataContext设置为其PlacementTarget的DataContext,并且每个菜单项的命令都将其作为其命令参数传递(例如,Edit Item本质上将该项对象传递给ViewModel.EditItem)。 / p>
我已经开始使用绑定了-我右键单击一个参数,它会打开正确的上下文菜单,如果我选择“编辑”,它将调用我的EditItemCommand,并将PlacementTarget.DataContext(即Parameter对象)作为CommandParameter,然后我可以进行更改,保存等。我遇到的问题是,如果以后尝试编辑其他项目,即使上下文菜单处于选中状态,CommandParameter仍绑定到我选择的第一个项目显然放在不同的参数上。如果再次选择edit,它仍会传递单击的第一项作为CommandParameter,而我将无法编辑第二项。
我怀疑这个问题与ContextMenu的DataContext没有随着PlacementTarget的更改而更新有关,但是在这里我有点不尽如人意。
是否有更好的方法将ContextMenu项的CommandParameter设置为PlacementTarget.DataContext?我在下面粘贴了一些xaml。
<ContextMenu x:Key='ParameterMenu'
DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Edit"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.Tag.EditItemCommand}"
CommandParameter="{Binding}" />
<MenuItem Header="Revert"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.Tag.RevertItemCommand}"
CommandParameter="{Binding}" />
<MenuItem Header="Delete"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.Tag.DeleteItemCommand}"
CommandParameter="{Binding}" />
</ContextMenu>
...
<DataTemplate DataType="{x:Type params:Parameter}">
<StackPanel Orientation="Horizontal"
Height='20'
Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeView}}, Path=DataContext}"
ContextMenu='{StaticResource ParameterMenu}'>
...
</StackPanel>
</DataTemplate>
编辑:我现在发现此问题出现在Windows 10计算机上,但是在Windows 7中,一切正常。两者都是.NET 4.6.1,并且都在运行VS 2015 Community Edition。