WPF Datagrid - 单击 DataGrid 中的空白时取消选择所选项目

问题描述 投票:0回答:6

默认行为是使用 CTRL+单击取消选择数据网格中的项目

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

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

编辑:

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

c# wpf datagrid
6个回答
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;
            }
         }
    }        
}

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

我用它来通过单击灰色空间来取消选择所有单元格。


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

0
投票

如果您有

SelectionUnit="FullRow"
,则必须使用
UnselectAllCells()
代替
UnselectAll()


0
投票

这也适用于将

SelectionMode
设置为
Extended

private void DataGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if ((sender is DataGrid grid) && (grid.SelectedCells != null) && (grid.SelectedCells.Count >= 1))
    {
        DataGridRow? selectedRow = null;
        foreach (object item in grid.SelectedItems)
        {
            DataGridRow dgr = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(item);
            if (dgr.IsMouseOver)
            {
                selectedRow = dgr;
            }
        }

        grid.UnselectAllCells();

        if (selectedRow != null)
        {
            selectedRow.IsSelected = true;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.