13

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

我希望能够用鼠标单击(左键或右键)网格中的空白并让它取消选择任何选定的项目。

我已经用谷歌搜索了它并发现了一些非常复杂的解决方法,但我希望有一个简单的解决方案。

编辑:

我现在改用列表视图,但仍然没有找到解决方案。列表视图稍微不那么烦人,因为它们的样式更好。

4

5 回答 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;
            }
         }
    }        
}
于 2013-08-05T20:04:44.473 回答
3

一个简单的

<DataGrid MouseDown="DataGrid_MouseDown">

是不是你想要的?

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

唯一的缺点是在没有 CTRL 的情况下单击所选项目也会取消选择。

于 2012-05-20T02:23:02.637 回答
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();
    }

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

于 2012-09-21T19:20:28.543 回答
0
private void dg_IsKeyboardFocusWithinChanged
    (object sender, DependencyPropertyChangedEventArgs e)
    {
        if (dg.SelectedItem != null) {
            dg.UnselectAll();
        }
    }
于 2014-07-08T12:35:49.720 回答
0

如果你有SelectionUnit="FullRow"你必须UnselectAllCells()改用UnselectAll().

于 2017-03-16T12:33:40.310 回答