WPF数据网格左上角的全选标题按钮无法聚焦网格

3

我的控件使用了WPF DataGrid。如果您单击左上角的空白标题,它会选择所有行。这是DataGrid的标准部分,不是我添加的任何内容。

然而,我的用户遇到问题,因为这个“按钮”没有将焦点集中在DataGrid上。我该怎么解决?

System.Windows.Controls.DataGrid

编辑:这是我所说的DataGrid按钮的Excel类比。 它不是真正的按钮,而是某种标题:

enter image description here

2个回答

4

如果您查看Snoop,您会注意到这个按钮。

enter image description here

因此,您可以编写事件处理程序来处理此按钮的Click事件,并在此处理程序中将焦点放在网格上。

private void myGrid_Loaded(object sender, RoutedEventArgs e)
{
    DataGrid dg = sender as DataGrid;
    Border border = VisualTreeHelper.GetChild(dg, 0) as Border;
    ScrollViewer scrollViewer = VisualTreeHelper.GetChild(border, 0) as ScrollViewer;
    Grid grid = VisualTreeHelper.GetChild(scrollViewer, 0) as Grid;
    Button button = VisualTreeHelper.GetChild(grid, 0) as Button;

    if (button != null && button.Command != null && button.Command == DataGrid.SelectAllCommand)
    {
        button.Click += new RoutedEventHandler(button_Click);
    }         
}

void button_Click(object sender, RoutedEventArgs e)
{     
    myGrid.Focus();           
}

4

我使用了一种不依赖于控件的可视树的替代方法:

在XAML中:

<DataGrid.CommandBindings>
<CommandBinding Command="SelectAll" Executed="MyGrid_SelectAll"/></DataGrid.CommandBindings>

在代码中:
private void MyGrid_SelectAll(object sender, ExecutedRoutedEventArgs e)
    {
        var myGrid = (DataGrid)sender;
        myGrid.Focus();
        if (myGrid.SelectedCells.Count == myGrid.Columns.Count * myGrid.Items.Count)
        {
            myGrid.SelectedCells.Clear();
        }
        else
        {
            myGrid.SelectAll();
        }

        e.Handled = true;
    }

这也使我能够在所有单元格都被选中时实现全部取消选择。

我认为这是一个更好的解决方案,但我认为您应该删除取消选择单元格的额外代码,因为这不是OP所问的问题。没有那个,你有一个非常清晰简单的答案,感觉比被接受的答案更声明式。 从您的答案中我不清楚的一件事是,即使将e.Handled设置为false,仍然必须执行myGrid.SelectAll()才能使其工作。 - Mark Adamson

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