如何使用EventToCommand处理来自WPF面板的子控件的路由事件?

时间:2013-10-30 14:56:10

标签: wpf eventtocommand

我有一个继承自Panel的控件。此控件基于绑定到自定义控件的集合创建按钮控件。如何处理来自孩子们的button.click事件?这是我的XAML。该命令无法执行。

   <ScrollViewer HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
      <control:TreeContainer HorizontalAlignment="Center" 
                             Width="Auto" Height="Auto" Margin="8,8,8,8" VerticalBuffer="20" 
                             RootNode="{Binding Path=RootNode}" 
                             ChildrenNodes="{Binding Path=ChildrenNodes}">
         <i:Interaction.Triggers>
            <i:EventTrigger EventName="Button.Click">
               <cmd:EventToCommand Command="{Binding Path=TreeContainerClickCommand, Mode=OneWay}" PassEventArgsToCommand="True" />
            </i:EventTrigger>
         </i:Interaction.Triggers>
      </control:TreeContainer>
   </ScrollViewer>

1 个答案:

答案 0 :(得分:0)

您可以将样式设置为控件中的所有按钮,并将命令绑​​定到那里。 将带有TargetType="Button"的样式添加到TreeContainer时,它将应用于TreeContainer中的所有按钮。

<ScrollViewer HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<control:TreeContainer HorizontalAlignment="Center" 
                         Width="Auto" Height="Auto" Margin="8,8,8,8" VerticalBuffer="20" 
                         RootNode="{Binding Path=RootNode}" 
                         ChildrenNodes="{Binding Path=ChildrenNodes}">
  <control:TreeContainer.Resources>
    <Style TargetType="Button">
      <Setter Property="Command" Value="{Binding Path=TreeContainerClickCommand, Mode=OneWay}"/>
    </Style>
  </control:TreeContainer.Resources>
 </control:TreeContainer>

如果您无法访问按钮中的TreeContainer ViewModel,则必须通过RelativeSource访问它:

<Setter Property="Command" 
        Value="{Binding Mode=OneWay,
                        Path=DataContext.TreeContainerClickCommand,
                        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type control:TreeContainer}}}" />

请注意,您必须将路径更改为DataContext.*,因为您的来源为TreeContainer,而不是其ViewModel。

编辑: 如果你确实需要一个EventTrigger来获取你的EventArgs,你可以像上面的按钮模板那样做。然后,您可以定义一个新模板,您可以在其中使用交互触发器。