2011-03-15 125 views
0

我目前有一个使用hierarchicaldatatemplate显示数据的树视图,当用户单击Remove按钮时,它将删除选定的节点。这按预期工作。使用HierarchicalDataTemplate将命令绑定到MenuItem

但是,我没有让用户点击一个按钮,而是试图通过右键单击节点并选择相应的菜单项来执行该命令。

这被证明是非常困难的,因为它被一个节点的视图模型(它不知道任何关于视图的东西)而不是视图的相应视图模型拾取。

有没有办法把控制权移交给View的ViewModel呢?

下面是删除按钮的代码:菜单项

public RelayCommand RemoveCommand 
     { 
      get 
      { 
       if (_removeCommand == null) 
       { 
        _removeCommand = new RelayCommand(
         () => this.Remove() 
         ); 
       } 
       return _removeCommand; 
      } 
     } 

     public void Remove() 
     { 
      _organLocationTree2.RemoveOrganLocations(ProjectOrganLocationView.GetExtendedTreeView().SelectedItems); 
      ProjectOrganLocationView.GetExtendedTreeView().SelectedItems.Clear(); 

      base.RaisePropertyChanged("DestOrganTree"); 
     } 

而XAML:

查看:

 <Button Content="Remove" Grid.Row="2" Height="23" VerticalAlignment="Top" Name="removeButton" 
       Width="75" Margin="5,20,5,0" Command="{Binding Path=RemoveCommand}" /> 

视图模型

  <local:ExtendedTreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}"> 
        <TextBlock Text="{Binding OrganName}" > 
      <TextBlock.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header ="Add SubNode" Command="{Binding Path=MenuItem_Add}"></MenuItem> 
        <MenuItem Header ="Remove Node" Command="{Binding Path=RemoveCommand}"></MenuItem> 
        <MenuItem Header ="Edit Node" Command="{Binding Path=ProjMenuItem_Edit}" 
           CommandParameter="{Binding DestOrganTree, Path=Selected.OrganName}"></MenuItem> 
       </ContextMenu> 
      </TextBlock.ContextMenu> 
        </TextBlock> 
       </HierarchicalDataTemplate> 
      </local:ExtendedTreeView.ItemTemplate> 
     </local:ExtendedTreeView> 

我试图实施R emove命令在节点的ViewModel中,但由于它不知道任何有关View的内容,所以它很快就变得非常混乱。

回答

2

嗯,我发现我的错误,我将上下文菜单绑定到树的节点而不是树本身。我在声明之外移动了上下文菜单,现在它按预期工作。

这是我对别人有此问题的更新XAML:

<local:ExtendedTreeView.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header ="Add SubNode" Command="{Binding Path=MenuItem_Add}"></MenuItem> 
          <MenuItem Header ="Remove Node" Command="{Binding Path=RemoveCommand}"></MenuItem> 
          <MenuItem Header ="Edit Node" Command="{Binding Path=ProjMenuItem_Edit}" 
             CommandParameter="{Binding DestOrganTree, Path=Selected.OrganName}"></MenuItem> 
         </ContextMenu>       
        </local:ExtendedTreeView.ContextMenu> 

        <local:ExtendedTreeView.ItemTemplate> 
         <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}"> 
          <TextBlock Text="{Binding OrganName}" > 
          </TextBlock> 
         </HierarchicalDataTemplate> 
        </local:ExtendedTreeView.ItemTemplate> 
+0

是的,这也是对我的作品更好。但我期待在树视图的每个级别上都有不同的上下文项目。我不认为这个解决方案可以解决这个问题...... #still_looking ... – CJBrew 2013-08-21 12:38:18

相关问题