将CommandParameter绑定到TreeView DataTemplate

时间:2019-07-30 20:15:35

标签: c# wpf binding contextmenu datatemplate

我有一个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。

0 个答案:

没有答案