默认行为是使用CTRL+单击来取消Datagrid中的项目选择。
我希望能够在网格中单击空白区域(左键或右键),并使其取消选择任何已选项目。
我已经通过谷歌搜索找到了一些非常复杂的解决方法,但我希望有一个简单的解决方案。
编辑:
我现在改用列表视图,但仍然没有找到解决方案。不过,由于它们的样式更好,所以使用列表视图会稍微少一些烦恼。
我也有同样的问题,后来找到了解决方法。这应该是内置行为:
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;
}
}
}
}
<DataGrid MouseDown="DataGrid_MouseDown">
这不是你想要的吗?
private void DataGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
(sender as DataGrid).SelectedItem = null;
}
我不确定您是指空白区域还是灰色区域。在后一种情况下,以下内容可以解决问题:
private void dataViewImages_MouseUp(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo hit = dataViewImages.HitTest(e.X, e.Y);
if (hit.Type != DataGridViewHitTestType.Cell)
dataViewImages.ClearSelection();
}
这是我用来通过点击灰色空间取消选择所有单元格的方法。
private void dg_IsKeyboardFocusWithinChanged
(object sender, DependencyPropertyChangedEventArgs e)
{
if (dg.SelectedItem != null) {
dg.UnselectAll();
}
}
如果你使用了SelectionUnit="FullRow"
,那么你需要使用UnselectAllCells()
而不是UnselectAll()
。
if(){ ... }
语句可以简化为dgr.IsSelected = dgr.IsMouseOver;
,因为检查和赋值都是bool
类型。 - Anders