2014-09-01 72 views
0

我有这样的代码:WPF双命令执行

<TreeView Name="ExplorerTreeViewStandard" Grid.Row="2" Margin="0,10,10,10" VerticalAlignment="Stretch" ItemsSource="{Binding TreeNodes}" FontSize="14" Background="Transparent" BorderThickness="0" 
        dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True" dd:DragDrop.DropHandler="{Binding}" dd:DragDrop.UseDefaultDragAdorner="True"> 
    <TreeView.ItemContainerStyle> 
     <!-- This Style binds a TreeViewItem to a TreeViewNodeViewModel --> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <!--<EventSetter Event="Selected" Handler="TreeViewSelectedItemChanged" />--> 
      <!--<EventSetter Event="Expanded" Handler="TreeExpanded" />--> 
      <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
      <Setter Property="FontWeight" Value="DemiBold" /> 
      <Setter Property="FontSize" Value="16" /> 
      <Setter Property="Foreground" Value="DarkBlue" /> 
      <Setter Property="mvvm:EventToCommand.Event" Value="MouseDoubleClick" /> 
      <Setter Property="mvvm:EventToCommand.Command" Value="{Binding RapidExecutionCommand}" /> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="FontWeight" Value="Bold" /> 
        <Setter Property="Foreground" Value="Yellow" /> 
        <Setter Property="Background" Value="Blue" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 

    <TreeView.Resources> 
     <!--/////////////////////////////////////--> 
     <!-- Provide the Templates per Node Type --> 
     <!--/////////////////////////////////////--> 
     <!-- Root Node Template --> 
     <HierarchicalDataTemplate DataType="{x:Type local:TreeViewRootNodeViewModel}" ItemsSource="{Binding Children}" > 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Refresh" Command="{Binding RefreshCommand}" /> 
         <Separator /> 
         <MenuItem Header="New Folder" Command="{Binding NewNodeCommand}" CommandParameter="{x:Static bo:NodeTypes.F}" /> 
         <MenuItem Header="New Project" Command="{Binding NewNodeCommand}" CommandParameter="{x:Static bo:NodeTypes.P}" /> 
         <Separator /> 
         <MenuItem Header="Paste" Visibility="{Binding Path=CanPaste, Converter={StaticResource BoolToVisibilityConverter}}" Command="{Binding CutCopyPasteNodeCommand}" CommandParameter="{x:Static local:NodeOperations.Paste}" /> 
        </ContextMenu> 
       </StackPanel.ContextMenu> 
       <Image Width="16" Height="16" Source="{Binding NodeIcon}" VerticalAlignment="Center" /> 
       <TextBlock Text="{Binding NodeData}" VerticalAlignment="Center" Margin="3,0,0,0" FontWeight="Bold" FontStyle="Italic" FontSize="20" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
     <!-- Folder Node Template --> 
     <HierarchicalDataTemplate DataType="{x:Type local:TreeViewFolderNodeViewModel}" ItemsSource="{Binding Children}" > 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Refresh" Command="{Binding RefreshCommand}" /> 
         <Separator /> 
         <MenuItem Header="New Folder" Command="{Binding NewNodeCommand}" CommandParameter="{x:Static bo:NodeTypes.F}" /> 
         <MenuItem Header="New Project" Command="{Binding NewNodeCommand}" CommandParameter="{x:Static bo:NodeTypes.P}" /> 
         <Separator /> 
         <MenuItem Header="Cut" Command="{Binding CutCopyPasteNodeCommand}" CommandParameter="{x:Static local:NodeOperations.Cut}" /> 
         <!--Copy folder disabled per bug# 1617 Dec-27-2013--> 
         <!--<MenuItem Header="Copy" Command="{Binding CutCopyPasteNodeCommand}" CommandParameter="{x:Static local:NodeOperations.Copy}" />--> 
         <MenuItem Header="Paste" Visibility="{Binding Path=CanPaste, Converter={StaticResource BoolToVisibilityConverter}}" Command="{Binding CutCopyPasteNodeCommand}" CommandParameter="{x:Static local:NodeOperations.Paste}" /> 
         <Separator /> 
         <MenuItem Header="Delete" Command="{Binding DeleteFolderCommand}" /> 
        </ContextMenu> 
       </StackPanel.ContextMenu> 
       <Image Width="16" Height="16" Source="{Binding NodeIcon}" VerticalAlignment="Center" /> 
       <TextBlock Text="{Binding NodeData}" VerticalAlignment="Center" Margin="3,0,0,0" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
     <!-- Project Node Template --> 
     <HierarchicalDataTemplate DataType="{x:Type local:TreeViewProjectNodeViewModel}" ItemsSource="{Binding Children}" > 
      <StackPanel Orientation="Horizontal"> 

       <StackPanel.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Refresh" Command="{Binding RefreshCommand}" /> 
         <Separator /> 
         <MenuItem Header="Rapid Execution" Command="{Binding RapidExecutionCommand}" Visibility="{Binding Path=EnableRapidExecution, UpdateSourceTrigger=PropertyChanged}" /> 
         <Separator /> 
         <!--Bug 1700--> 
         <!--<MenuItem Header="New Folder" Command="{Binding NewNodeCommand}" CommandParameter="{x:Static bo:NodeTypes.F}" /> 
         <MenuItem Header="New Project" Command="{Binding NewNodeCommand}" CommandParameter="{x:Static bo:NodeTypes.P}" />--> 
         <!--<Separator />--> 
         <MenuItem Header="Cut" Command="{Binding CutCopyPasteNodeCommand}" CommandParameter="{x:Static local:NodeOperations.Cut}" /> 
         <!--Copy project disabled per bug# 1617 Dec-27-2013--> 
         <!--<MenuItem Header="Copy" Command="{Binding CutCopyPasteNodeCommand}" CommandParameter="{x:Static local:NodeOperations.Copy}" />--> 
         <MenuItem Header="Paste" Visibility="{Binding Path=CanPaste, Converter={StaticResource BoolToVisibilityConverter}}" Command="{Binding CutCopyPasteNodeCommand}" CommandParameter="{x:Static local:NodeOperations.Paste}" /> 
         <Separator /> 
         <MenuItem Header="Disable Project" Command="{Binding DisableProjectCommand}" Visibility="{Binding Path=EnableDisable, UpdateSourceTrigger=PropertyChanged}" /> 
         <MenuItem Header="Resume Project" Command="{Binding ResumeProjectCommand}" Visibility="{Binding Path=EnableResume, UpdateSourceTrigger=PropertyChanged}" /> 
         <MenuItem Header="Clone Project" Command="{Binding CloneProjectCommand}" Visibility="{Binding Path=EnableClone, UpdateSourceTrigger=PropertyChanged}" /> 
         <MenuItem Header="Clone Related Project" Command="{Binding CloneRelatedProjectCommand}" /> 
         <MenuItem Header="Update Group Properties" Visibility="{Binding Path=EnableRelated, UpdateSourceTrigger=PropertyChanged}" > 
          <MenuItem Header="Split Project" Command="{Binding SplitRelatedProjectCommand }" /> 
          <MenuItem Header="All Related Projects" Command="{Binding UpdateRelatedProjectCommand }" /> 
          </MenuItem> 


         <Separator /> 
         <MenuItem Header="Show Versions" Command="{Binding ShowVersionsCommand}" /> 
         <MenuItem Header="Collapse Versions" Command="{Binding CollapseVersionsCommand}" /> 
         <!--<Separator />--> 
         <!--<MenuItem Header="Delete" Command="{Binding DeleteNodeCommand}" />--> 
        </ContextMenu> 
       </StackPanel.ContextMenu> 
       <Image Width="16" Height="16" Source="{Binding NodeIcon}" VerticalAlignment="Center" /> 
       <TextBlock Text="{Binding NodeData}" VerticalAlignment="Center" Margin="3,0,0,0" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
     <!-- Version Node Template --> 
     <HierarchicalDataTemplate DataType="{x:Type local:TreeViewVersionNodeViewModel}" ItemsSource="{Binding Children}" > 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Rapid Execution" Command="{Binding RapidExecutionVersionCommand}" Visibility="{Binding Path=EnableRapidExecution, UpdateSourceTrigger=PropertyChanged}" /> 
         <Separator /> 
         <MenuItem Header="ReOpen" Command="{Binding ReOpenCommand}" /> 
        </ContextMenu> 
       </StackPanel.ContextMenu> 
       <Image Width="16" Height="16" Source="{Binding NodeIcon}" VerticalAlignment="Center" /> 
       <TextBlock Text="{Binding NodeData}" VerticalAlignment="Center" Margin="3,0,0,0" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

的问题是,当我双击并运行“RapidExecutionCommand”我有它的版本类和项目类(项目之父版本)。 因此,当我双击项目一切都很好,但是当我双击版本时,它从版本和项目运行命令。

任何sujestions如何解决这个问题?

我tryid这样的:

<Setter Property="mvvm:EventToCommand.Event" Value="MouseDoubleProjectClick" /> 
<Setter Property="mvvm:EventToCommand.Command" Value="{Binding MouseDoubleProjectClick}" /> 
<Setter Property="mvvm:EventToCommand.Event" Value="MouseDoubleVersionClick" /> 
<Setter Property="mvvm:EventToCommand.Command" Value="{Binding MouseDoubleVersionClick}" /> 

但没有eather工作,只有项目共进午餐。

新编辑: 添加此操作但e.handler始终为false。

private static void CommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
{ 
    Control control = target as Control; 
    if (control != null) 
    { 

     if ((e.NewValue != null) && (e.OldValue == null)) 
     { 
      control.MouseDoubleClick += OnMouseDoubleClick; 
     } 
     else if ((e.NewValue == null) && (e.OldValue != null)) 
     { 
      control.MouseDoubleClick -= OnMouseDoubleClick; 
     } 
    } 
} 

private static void OnMouseDoubleClick(object sender, RoutedEventArgs e) 
{ 
    Control control = sender as Control; 
    ICommand command = (ICommand)control.GetValue(CommandProperty); 
    object commandParameter = control.GetValue(CommandParameterProperty); 
    command.Execute(commandParameter); 
    e.Handled = true; 
} 

任何帮助将是伟大的。

回答

0

您需要将事件标记为已处理,以便它不会继续向上传播WPF VisualTree。

通话将类似于:

e.Handled = true; 

其中e是你EventArgs参数事件处理程序。

+0

完成它, 它仍然有好处。 “e.Handled”;仍然错误,当它去父亲 – igor 2014-09-01 10:22:50

+0

尽量不要''EventHandler'和'Command'在'TreeView.ItemContainerStyle'风格。将它们放入每个项目的'HierarchicalDataTemplate'中。 'Command'和'EventHandler'应该对'TreeView'边界项运行,所以将它分配给该项。 – toadflakz 2014-09-01 10:33:26

+0

我编辑的问题,你可以检查,如果你觉得? thnks。 – igor 2014-09-01 11:26:54