简体   繁体   中英

How to fire double click event in a combobox in a child user control?

I have a user control that use another user control. The child user control has a combobox and the click event works because i can open the combobox, but the double click it doesn't work.

My code is this:

Main user control:

<StackPanel>
    <views:ucMyChildUserControl/>
</StackPanel>

My child user control:

<StackPanelOrientation="Horizontal">
    <StackPanel Orientation="Vertical">
        <Label Content="Content" Style="{StaticResource LabelDefault}"/>
        <ComboBox Name="cmbMyCombobox"/>
    </StackPanel>

    <!--More related controls-->
    
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding MyCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</StackPanel>

But I have realized that if the comand of mouse double click is set in the parent user control, it works:

<views:ucChildUserControl>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding MyCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</views:ucChildUserControl>

So I guess the problem is about the handling of the event, but I don't know how to catch it in the child user control.

Thanks.

The issue is that the MouseDoubleClick event and the PreviewMouseDoubleClick are defined on Control . Since UserControl is a derivative of Control , the event is available and can be handled. However, StackPanel is not a derivative of Control so the event is not available, therefore the trigger does not work.

There are workarounds to this in code-behind that you can eventually turn into a behavior for MVVM, but simple workarounds like using input bindings on the left mouse click action only work on some elements, as others like ComboBox will already handle it and then the input bindings are not triggered .

<StackPanel Orientation="Horizontal">
   <StackPanel.InputBindings>
      <MouseBinding MouseAction="LeftDoubleClick"
                    Command="{Binding MyCommand}"/>
   </StackPanel.InputBindings>
   <StackPanel Orientation="Vertical">
      <Label Content="Content"/>
      <ComboBox Name="cmbMyCombobox"/>
   </StackPanel>

   <!--More related controls-->

</StackPanel>

The most simple solution without creating additional code is to wrap the StackPanel in a control that is a derivative of Control , eg a ContentControl , like this.

<ContentControl>
   <StackPanel Orientation="Horizontal">
      <StackPanel Orientation="Vertical">
         <Label Content="Content"/>
         <ComboBox Name="cmbMyCombobox"/>
      </StackPanel>

      <!--More related controls-->

   </StackPanel>
   <b:Interaction.Triggers>
      <b:EventTrigger EventName="MouseDoubleClick">
         <b:InvokeCommandAction Command="{Binding MyCommand}" />
      </b:EventTrigger>
   </b:Interaction.Triggers>
</ContentControl>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM