2012-05-19 11 views
5

Zachowaniem domyślnym jest użycie Ctrl + kliknięcie, aby usunąć zaznaczenie pozycji w DataGridWPF DataGrid - odznaczyć wybrany element (y) po kliknięciu spacje w DataGrid

Chcę móc kliknięciem myszy (przycisk w lewo lub w prawo) białych znaków w siatce i odznacz wszystkie wybrane elementy.

Zrobiłem go google na śmierć i znalazłem kilka niewiarygodnie skomplikowanych obejść, ale mam nadzieję na proste rozwiązanie.

Edit:

Obecnie używam listview zamiast, a jeszcze nie miałaś znaleźć rozwiązanie. Jest nieco mniej denerwujący w porównaniu z listview, ponieważ są lepiej stylizowane.

Odpowiedz

3

Prosty

<DataGrid MouseDown="DataGrid_MouseDown"> 

nie jest to, co chcesz?

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

Jedyną wadą jest to, że kliknięcie bez CTRL na wybranym elemencie odznaczy zbyt.

0

Nie jestem pewien, czy masz na myśli białą przestrzeń lub szare miejsce. W tym ostatnim przypadku następuje spełnia swoje zadanie:

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

To co mogę używać, aby usunąć zaznaczenie wszystkich komórek klikając w szarej przestrzeni.

+2

Twoja odpowiedź dotyczy WinForms, pytanie dotyczy WPF. –

+0

Twoja odpowiedź nie jest dobra na to pytanie, jak powiedział Matthew, ale pomogłeś mi rozwiązać ten sam problem w WinForm. Więc dziękuję! – leetNightshade

10

Miałem to samo pytanie i znalazłem rozwiązanie. To powinno być wbudowane w zachowaniu:

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

Wiem, że to lat, ale nadal, czy nie powinno być "if (dgr.IsMouseOver)" zamiast "if (! Dgr.IsMouseOver)"? To zadziałało dla mnie po tej zmianie. – user2475983

+0

Chciałbym zaznaczyć, po kilku latach, że można wywołać grid.CommitEdit(), aby zatwierdzić zmiany po opuszczeniu aktualnie edytowanej komórki (jeśli takie istnieją). Może to być pomocne zwłaszcza w przypadku komórek ComboBox. –

+0

Znalazłem to rozwiązanie przydatne, mimo że ma kilka lat. Chciałbym zaznaczyć, że instrukcja 'if() {...}' może zostać uproszczona do 'dgr.IsSelected = dgr.IsMouseOver;' ponieważ sprawdzanie i przypisanie są oba typu 'bool'. – Anders

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

Jeśli masz SelectionUnit="FullRow" trzeba użyć UnselectAllCells() zamiast UnselectAll().