web-dev-qa-db-fra.com

Comment lier une commande dans WPF à un gestionnaire d'événements double-clic d'un contrôle?

J'ai besoin de lier l'événement de double clic d'un bloc de texte (ou potentiellement une image également - de toute façon, c'est un contrôle utilisateur), à une commande dans mon ViewModel.

TextBlock.InputBindings ne semble pas se lier correctement à mes commandes, une aide?

61
bluebit
10
Kent Boogaart
<Button>
<Button.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="YourCommand" />
</Button.InputBindings>
</Button>

http://thejoyofcode.com/Invoking_a_Command_on_a_Double_Click_or_other_Mouse_Gesture.aspx

240
Legz

c'est simple, utilisons la méthode MVVM: j'utilise ici MVVM Light qui est facile à apprendre et solide.

1. insérez les lignes suivantes dans les déclarations xmlns:

xmlns:i="http://schemas.Microsoft.com/expression/2010/interactivity"  
xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;
                                   Assembly=GalaSoft.MvvmLight.Extras.WPF4"

2. définissez votre bloc de texte comme ceci:

<textBlock text="Text with event">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="MouseDoubleClick">
         <GalaSoft_MvvmLight_Command:EventToCommand 
                             Command="{Binding Edit_Command}"/>
      </i:EventTrigger>
   </i:Interaction.Triggers>
</textBlock>

3. écrivez ensuite votre code de commande dans votre viewmodel !!!

ViewModel1.cs

Public RelayCommand Edit_Command
{
   get;
   private set;
}

Public ViewModel1()
{
   Edit_Command=new RelayCommand(()=>execute_me());
}

public void execute_me()
{
   //write your code here
}

J'espère que cela fonctionne pour vous car je l'ai utilisé dans Real ERP application

6
Adam

J'ai également eu un problème similaire où j'avais besoin de lier l'événement MouseDoubleClick d'une liste à une commande dans mon ViewModel.

La solution la plus simple que j'ai trouvée est de mettre un bouton factice qui a la liaison de commande souhaitée et d'appeler la méthode Execute de la commande du bouton dans le gestionnaire d'événements de l'événement MouseDoubleClick.

.xaml

 <Button Visibility="Collapsed" Name="doubleClickButton" Command="{Binding Path=CommandShowCompanyCards}"></Button>
                <ListView  MouseDoubleClick="ListView_MouseDoubleClick" SelectedItem="{Binding Path=SelectedCompany, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" Margin="0,10,0,0" ItemsSource="{Binding Path=CompanyList, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" HorizontalContentAlignment="Stretch" >

codebehind

     private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
            {
                doubleClickButton.Command.Execute(null);
            }

Ce n'est pas simple mais c'est vraiment simple et ça marche.

1
irem