2017-08-23 125 views
1

我想在显示一个contextMenu项目时使用右键单击树视图项目。将contextMenu绑定到树视图的不同视图模型

之后,我想使用一个命令,当我点击我的MenuItem,但我需要绑定命令与不同的viewmodel和命令参数与良好的viewmodel谁来自我的treeview选定的项目。

所以,就目前而言,我有这样的事情:

<TreeView x:Name="TreeViewProtocolsAndEquipments" AllowDrop="True" 
     ItemsSource="{Binding ModuleParams}"> 

     <TreeView.Resources> 
      <!-- CONTEXT MENU --> 
      <!-- Protocol -->  
      <ContextMenu x:Key="ContextMenuProtocol"> 
       <MenuItem Header="Add new equipment" Command="{Binding AddNewEquipmentCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"> 
        <MenuItem.Icon> 
         <Image Source="Images/Add.png" /> 
        </MenuItem.Icon> 
       </MenuItem> 
       <Separator /> 
      </ContextMenu> 

      <!-- MODULE XXX --> 
      <!-- ModuleParam > xxx --> 
      <HierarchicalDataTemplate DataType="{x:Type xxx:ModuleParamXXXViewModel}" ItemsSource="{Binding ModuleItems}"> 
       <TextBlock Text="XXX" Foreground="Green" ContextMenu="{StaticResource ContextMenuProtocol}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 

    </TreeView> 

对于我的命令被绑定到时刻XXX:ModuleParamXXXViewModel如果我只是让{结合}

  1. 我可以绑定我命令到我ActivatedProtocolsAndEquipmentsTreeViewModel(这个用户控件的datacontext)并保留在CommandParameter我的xxx:ModuleParamXXXViewModel(谁是我们触发右键单击以显示contextMenu的树视图中的项目)?
  2. 如何用MVVM实践以其他方式实现此目标?

我还试图用这一点,但它并没有太多的工作:

<MenuItem Header="Add new equipment" Command="{Binding Path=DataContext.AddNewEquipmentCommand, Source={x:Reference TreeViewProtocolsAndEquipments}}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"> 

而与此我得到对象引用不设置到对象的实例

回答

0

UserControl不是MenuItem的可视祖先,因为ContextMenu驻留在它自己的可视化树中。

绑定TextBlockUserControl,然后Tag属性Command属性绑定到ContextMenuPlacementTarget

<TreeView x:Name="TreeViewProtocolsAndEquipments" AllowDrop="True" 
        ItemsSource="{Binding ModuleParams}"> 
    <TreeView.Resources> 
     <!-- CONTEXT MENU --> 
     <!-- Protocol --> 
     <ContextMenu x:Key="ContextMenuProtocol"> 
      <MenuItem Header="Add new equipment" 
           Command="{Binding PlacementTarget.Tag.DataContext.AddNewEquipmentCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 
           CommandParameter="{Binding}"> 
       <MenuItem.Icon> 
        <Image Source="Images/Add.png" /> 
       </MenuItem.Icon> 
      </MenuItem> 
      <Separator /> 
     </ContextMenu> 

     <!-- MODULE XXX --> 
     <!-- ModuleParam > xxx --> 
     <HierarchicalDataTemplate DataType="{x:Type xxx:ModuleParamXXXViewModel}" ItemsSource="{Binding ModuleItems}"> 
      <TextBlock Text="XXX" Foreground="Green" 
           Tag="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}" 
           ContextMenu="{StaticResource ContextMenuProtocol}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 
+0

感谢你的帮助,它的工作原理,但现在它永远不会触发我的ContextMenu,当我右键单击一个菜单项,它不显示contextMenu,但执行命令...我的绑定在菜单项中,所以,对于我来说,它必须在context菜单中的菜单项上单击而不是触发moduleitem在视觉树中的权利?那么为什么它执行这样的命令呢? – Karakayn

+0

它的工作原理,但你没有看到ContextMenu?这恐怕没有意义。另外,根据我的建议更改绑定不会导致ContextMenu消失,所以我不知道您在做什么。 – mm8

+0

我只是愚蠢的,我让我的CommandHandler构造函数中的某个地方_canExecute = true;所以它可以始终执行命令,不再需要点击...现在它可以工作,但我只是禁用了MenuItem,所以我不能再点击它...我会尝试找出发生了什么事(通过这个visualtree和logicaltree),谢谢你的帮助! – Karakayn