WPF datagrid ligne sélectionnée cliqué événement?

je veux exécuter du code quand une ligne sélectionnée de la Datagrade WPF est double-cliquée. Je sais que le datagrid a un événement MouseDoubleClicked et qu'il a aussi un événement row selected mais je ne vois aucun événement pour "selected row double clicked" ...

pensez-vous qu'il est possible de capturer cet événement en quelque sorte ?

30
demandé sur demonplus 2010-06-25 22:47:13

5 réponses

vous pouvez ajouter le gestionnaire d'événement dans le ItemContainerStyle (qui est le style appliqué à une ligne) :

<DataGrid ... >
    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
        </Style>
    </DataGrid.ItemContainerStyle>
    ...
</DataGrid>

Ensuite, dans le gestionnaire, vous pouvez vérifier si la ligne est sélectionnée

private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
    // execute some code
}
48
répondu Thomas Levesque 2015-10-30 14:46:39

cette question est venue pour moi tout en cherchant une solution et les réponses n'ont pas fonctionné, que ce soit en raison de l'âge ou de ma propre mise en œuvre. Dans tous les cas, voici la solution qui a fonctionné pour moi.

ajouter L'événement MouseDoubleClick au DataGrid

        <DataGrid x:Name="DatagridMovie"
              Width="Auto"
              CanUserAddRows="False"
              CanUserDeleteRows="True"
              IsReadOnly="true"
              ItemsSource="{Binding}"
              MouseDoubleClick="Row_MouseDoubleClick">

et dans la méthode

private void Row_MouseDoubleClick(object sender, MouseButtonEventArgs e)
                {                
                    // Ensure row was clicked and not empty space
                    DataGridRow row = ItemsControl.ContainerFromElement((DataGrid)sender, e.OriginalSource as DependencyObject) as DataGridRow;
                    if ( row == null ) return;

                    ...
                    Stuff();
                }

jusqu'à présent, je n'ai pas remarqué de problèmes avec elle. Il ne partage pas le problème que les autres ont ce qui signifie double cliquant un en-tête ou l'espace vide avec une ligne sélectionnée à l'avance serait encore provoquer à terme.

15
répondu Gilgamesh 2015-04-08 04:30:33

Vous pouvez essayer le gestionnaire d'événements cell changed en cours il ne fonctionne qu'avec un clic et non pas un double clic si c'est ce que vous recherchez, puisque le double clic peut être utilisé pour initier l'édition de la cellule ou de la rangée entière ou pour tout autre processus:

private void datagrid_CurrentCellChanged(object sender, EventArgs e)
    {
        int selected_index = datagrid.SelectedIndex + 1;
        // this is used for debugging and testing.
        //MessageBox.Show("The index of the row for the clicked cell is " + selected_index);

    }
4
répondu 0x01Brain 2015-09-08 15:49:20

ItemContainerStyle ne pas avoir la meilleure solution, suggérez d'utiliser le RowStyle:

Dans votre code XAML:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">        
        <EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
    </Style>
</DataGrid.RowStyle>

dans votre Code:

private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    //your logic here
}
0
répondu Darlan Dieterich 2018-06-02 16:06:29

pourquoi ne pas obtenir la propriété SelectedRow pendant que L'événement DoubleClick se produit et en faire quelque chose? Si la commande SelectedRow est nulle, cela signifie qu'aucune ligne n'est sélectionnée, alors il suffit de retourner

private void Grid_DoubleClick(object sender, RoutedEventArgs e)
{
    if(grid.SelectedRow == null)
        return; // return if there's no row selected

    // do something with the Selected row here
}
-1
répondu Carlo 2010-06-25 19:28:43