2010-06-25 43 views
26

Quiero ejecutar algún código cuando se hace doble clic en una fila seleccionada de WPF DataGrid. Sé que la cuadrícula de datos tiene un evento MouseDoubleClicked y que también tiene un evento de fila seleccionada, pero no veo ningún evento para "fila seleccionada haga doble clic" ...WPF datagrid selected row clicked event?

¿Cree que es posible capturar este evento de alguna manera? ?

+0

Si utiliza el método Caliburn.Micro y MVVM, hay una forma más sencilla de lograr esto - [Obtención de información de fila después de un doble clic] (http://stackoverflow.com/questions/9487084/getting-row- información-después-de-doble clic). – Sevenate

Respuesta

43

puede agregar el controlador de eventos en el ItemContainerStyle (que es el estilo aplicado a una fila):

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

Entonces , en el controlador, se puede comprobar si se selecciona la fila

private void Row_DoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    // execute some code 
} 
+0

FWIW, no pude hacer funcionar 'RoutedEvent'. Aparece un mensaje de error: "La propiedad 'RoutedEvent' no se encontró en el tipo 'EventSetter'." Pude hacerlo funcionar cambiando a RoutedEvent a Event. –

+0

@CoreyCole, tienes razón, fue un error. Gracias por mencionarlo. –

+1

Encontré poniéndolo en '' trabajado donde 'ItemContainerStyle' no. – simonalexander2005

-1

¿Por qué no obtiene la propiedad SelectedRow mientras ocurre el evento DoubleClick y hace algo al respecto? Si el SelectedRow es nula, significa que ninguna fila se selecciona por lo que sólo volver

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 
} 
+2

Esto no funcionaría. El usuario podría primero seleccionar la fila y luego hacer doble clic en el área vacía. – Ivan

12

Esta pregunta surgió para mí en la búsqueda de una solución y las respuestas no trabajar, ya sea por la edad o mi propia implemen tación. De cualquier manera, aquí está la solución que funcionó para mí.

añadir el evento MouseDoubleClick a la cuadrícula de datos

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

y en el método

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(); 
       } 

Hasta ahora no he notado ningún problema con ella. No comparte el problema que otros tienen que significa que al hacer doble clic en un encabezado o en el espacio vacío con una fila seleccionada de antemano todavía se provocaría su ejecución.

+1

es posible que desee hacer 'e.handled = True;' antes de devolver – simonalexander2005

4

Puede probar el controlador de eventos cambiado de celda actual solo funciona con un clic y no hace doble clic si eso es lo que busca, ya que puede usar doble clic para iniciar la celda de edición o toda la fila o para cualquier otro proceso:

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); 

    } 
+3

Probablemente debería usar el evento 'SelectionChanged'. El índice seleccionado parece estar rezagado para este evento. –