0

我有一个从 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>
4

1 回答 1

0

您可以为控件中的所有按钮设置样式,并在那里绑定命令。当您将 Style with 添加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>

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

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

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

编辑:如果你真的需要一个EventTrigger来获得你的EventArgs,你可以用按钮的模板做同样的事情。然后您可以定义一个新模板,您可以在其中使用您的交互触发器。

于 2013-10-30T15:05:55.700 回答