C# 双命令执行

C# 双命令执行,c#,wpf,xaml,treeview,setter,C#,Wpf,Xaml,Treeview,Setter,我有以下代码: <TreeView Name="ExplorerTreeViewStandard" Grid.Row="2" Margin="0,10,10,10" VerticalAlignment="Stretch" ItemsSource="{Binding TreeNodes}" FontSize="14" Background="Transparent" BorderThickness="0" dd:DragDrop.IsDragSourc

我有以下代码:

<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>

任何帮助都会很好。

您需要将事件标记为已处理,这样它就不会在WPF VisualTree上进一步移动

该呼叫将类似于:

e.Handled = true;

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

完成了,它仍然是hapands。“e.Handled”;如果未将
EventHandler
命令
放入
TreeView.ItemContainerStyle
样式中,则返回fatherTry时仍然为false。将它们放在每个项目的
HierarchycalDataTemplate
中。
命令
EventHandler
应该针对
TreeView
绑定项运行,因此将其分配给该项。我编辑了这个问题,您是否可以检查您所做的?thnks。
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;
}
e.Handled = true;