2012-05-19 20 views
5

El comportamiento por defecto es usar CTRL + clic para anular la selección de los elementos de la cuadrícula de datosWPF DataGrid - anular la selección de elemento (s) seleccionado al hacer clic en un espacio en blanco en la cuadrícula de datos

Quiero ser capaz de clic del ratón (botón izquierdo o derecho) los espacios en blanco en la cuadrícula y hacer que anule la selección de los elementos seleccionados.

Lo busqué en Google y encontré algunas soluciones increíblemente complejas, pero estoy esperando una solución simple.

Editar:

Ahora estoy usando una vista de lista en su lugar, y todavía havent encontró una solución. Sin embargo, es un poco menos molesto con una lista porque tienen un mejor estilo.

Respuesta

3

Un simple

<DataGrid MouseDown="DataGrid_MouseDown"> 

no es lo que quiere?

private void DataGrid_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    (sender as DataGrid).SelectedItem = null; 
} 

La única desventaja es que un clic sin CTRL en un elemento seleccionado anula la selección también.

0

No estoy seguro de si se refiere a espacio en blanco o espacio gris. En este último caso, el siguiente hace el trabajo:

private void dataViewImages_MouseUp(object sender, MouseEventArgs e) 
    { 
     DataGridView.HitTestInfo hit = dataViewImages.HitTest(e.X, e.Y); 
     if (hit.Type != DataGridViewHitTestType.Cell) 
      dataViewImages.ClearSelection(); 
    } 

Esto es lo que uso para anular la selección de todas las celdas haciendo clic en el espacio gris.

+2

Su respuesta es para WinForms, la pregunta es sobre WPF. –

+0

Su respuesta no es buena para la pregunta, como dijo Matthew, pero me ayudó a resolver el mismo problema en WinForms. ¡Así que gracias! – leetNightshade

10

Tuve la misma pregunta y encontré una solución. Esto debe ser incorporado en el comportamiento:

private void dataGrid1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (sender != null) 
    { 
     DataGrid grid = sender as DataGrid; 
     if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1) 
     { 
      DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem) as DataGridRow; 
      if (!dgr.IsMouseOver) 
      { 
       (dgr as DataGridRow).IsSelected = false; 
      } 
     } 
    }   
} 
+0

Sé que es un año pero aún así, ¿no debería ser "if (dgr.IsMouseOver)" en lugar de "if (! Dgr.IsMouseOver)"? Me funcionó después de ese cambio. – user2475983

+0

Me gustaría señalar, después de algunos años, que se puede llamar a grid.CommitEdit() para confirmar las ediciones después de salir de la celda que se está editando actualmente (si hay alguna). Esto puede ser útil, especialmente en el caso de las células ComboBox. –

+0

Encontré esta solución útil, a pesar de que tiene algunos años. Me gustaría señalar que la declaración 'if() {...}' se puede simplificar a 'dgr.IsSelected = dgr.IsMouseOver;' ya que la verificación y la asignación son ambas de tipo 'bool'. – Anders

0
private void dg_IsKeyboardFocusWithinChanged 
    (object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (dg.SelectedItem != null) { 
      dg.UnselectAll(); 
     } 
    } 
0

Si tiene SelectionUnit="FullRow" usted tiene que utilizar UnselectAllCells() lugar UnselectAll().

Cuestiones relacionadas