WPF数据表格 - 单击数据表格中的空白处时取消选择已选定的项目

15

默认行为是使用CTRL+单击来取消Datagrid中的项目选择。

我希望能够在网格中单击空白区域(左键或右键),并使其取消选择任何已选项目。

我已经通过谷歌搜索找到了一些非常复杂的解决方法,但我希望有一个简单的解决方案。

编辑:

我现在改用列表视图,但仍然没有找到解决方案。不过,由于它们的样式更好,所以使用列表视图会稍微少一些烦恼。

5个回答

18

我也有同样的问题,后来找到了解决方法。这应该是内置行为:

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

1
我知道这是一年前的问题,但是难道不应该是“if(dgr.IsMouseOver)”而不是“if(!dgr.IsMouseOver)”吗?在更改后它对我起作用了。 - user2475983
1
想要指出的是,几年后,人们可以调用grid.CommitEdit()来提交编辑,以便在离开当前正在编辑的单元格后(如果有任何单元格需要编辑),进行提交。这在ComboBox单元格的情况下尤其有帮助。 - Yiyuan Lee
我发现这个解决方案很有用,尽管它已经几年了。我想指出if(){ ... }语句可以简化为dgr.IsSelected = dgr.IsMouseOver;,因为检查和赋值都是bool类型。 - Anders

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

这是我用来通过点击灰色空间取消选择所有单元格的方法。


3
你的回答是针对WinForms的,而问题是关于WPF的。 - user203570
你的回答并不是针对这个问题的,正如Matthew所说,但是你帮助我解决了WinForms中相同的问题。所以,谢谢! - leetNightshade

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

0

如果你使用了SelectionUnit="FullRow",那么你需要使用UnselectAllCells()而不是UnselectAll()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接