【问题标题】:WPF Datagrid - deselect selected item(s) when clicking whitespace in the DataGridWPF Datagrid - 单击 DataGrid 中的空白时取消选择所选项目
【发布时间】:2012-05-19 16:32:53
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    我有同样的问题并找到了解决方案。这应该是内置的行为:

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

    【讨论】:

    • 我知道它已经有一年的历史了,但它不应该是“if(dgr.IsMouseOver)”而不是“if(!dgr.IsMouseOver)”吗?更改后它对我有用。
    • 想指出,几年后,在离开当前正在编辑的单元格(如果有的话)之后,可能会调用 grid.CommitEdit() 来提交编辑。这可能很有帮助,尤其是在 ComboBox 单元格的情况下。
    • 我发现这个解决方案很有用,尽管它已经有几年历史了。我想指出,if(){ ... } 语句可以简化为dgr.IsSelected = dgr.IsMouseOver;,因为检查和赋值都是bool 类型。
    【解决方案2】:

    一个简单的

    <DataGrid MouseDown="DataGrid_MouseDown">
    

    不是你想要的?

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

    唯一的缺点是在选定项目上不按 CTRL 的单击也会全部取消选择。

    【讨论】:

      【解决方案3】:

      我不确定您是指空白区域还是灰色区域。在后一种情况下,以下工作:

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

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

      【讨论】:

      • 你的答案是针对 WinForms,问题是关于 WPF。
      • 你的回答对这个问题不好,正如马修所说,但你帮助我在 WinForms 中解决了同样的问题。所以,谢谢!
      【解决方案4】:
      private void dg_IsKeyboardFocusWithinChanged
          (object sender, DependencyPropertyChangedEventArgs e)
          {
              if (dg.SelectedItem != null) {
                  dg.UnselectAll();
              }
          }
      

      【讨论】:

        【解决方案5】:

        如果您有SelectionUnit="FullRow",则必须使用UnselectAllCells() 而不是UnselectAll()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-18
          • 2020-12-14
          • 2011-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多