【问题标题】:How do I use EventToCommand to handle routed event from a child control of a WPF panel?如何使用 EventToCommand 处理来自 WPF 面板的子控件的路由事件?
【发布时间】:2013-10-30 14:56:10
【问题描述】:

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

【问题讨论】:

    标签: wpf eventtocommand


    【解决方案1】:

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

    <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}}}" />
    

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

    编辑: 如果您真的需要EventTrigger 来获取您的EventArgs,您可以使用按钮模板执行与上述相同的操作。然后您可以定义一个新模板,您可以在其中使用您的交互触发器。

    【讨论】:

    • 这让我的命令触发,但我没有从使用 EventToCommand 获得我想要的事件参数。
    • 你需要从 eventargs 中得到什么,你能用 CommandParameter 代替吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2012-06-27
    • 2011-02-25
    相关资源
    最近更新 更多