2012-05-19 83 views
5

的默認行爲是使用CTRL +單擊取消DataGrid中的項目WPF的Datagrid - 取消選擇的項目(S)在DataGrid點擊空格時

我希望能夠以鼠標點擊(向左或向右按​​鈕)網格中的空白並使其取消選擇任何選定的項目。

我是一派死刑,並發現了一些令人難以置信的複雜的解決方法,但我希望有一個簡單的解決方案。

編輯:

現在,我使用列表視圖來代替,仍然還沒有找到一個解決方案。儘管它們的風格比較好,但它與列表視圖相比稍微不討厭。

回答

3

簡單

<DataGrid MouseDown="DataGrid_MouseDown"> 

是不是你想要的?

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

唯一的缺點是,在選定項目上單擊沒有CTRL也會取消選擇。

0

我不知道是否意味着空白或灰色空間。在後一種情況下,作業如下:

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

這是我用來通過單擊灰色空間取消選擇所有單元格。

+2

你的回答是的WinForms,問題是關於WPF。 –

+0

Matthew說,你的回答對於這個問題並不好,但是你幫助我解決了WinForms中的同樣的問題。那謝謝啦! – leetNightshade

10

我有同樣的問題,並找到了解決辦法。這應該是建立在行爲:

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

我知道這是歲,但仍然應該不會是「如果(dgr.IsMouseOver)」而不是「如果(!dgr.IsMouseOver)」?它在改變之後爲我工作。 – user2475983

+0

想指出的是,幾年後,一個可以調用grid.CommitEdit()離開當前正在編輯的單元格(如果有的話)之後提交的修改。這在ComboBox單元的情況下尤其有用。 –

+0

我發現這個解決方案很有用,儘管它已經過了幾年。我想指出'if(){...}'語句可以簡化爲'dgr.IsSelected = dgr.IsMouseOver;',因爲檢查和賦值都是'bool'類型。 – Anders

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

如果你有SelectionUnit="FullRow"你必須使用UnselectAllCells()代替UnselectAll()