3

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

但是,我的用户遇到了麻烦,因为这个“按钮”没有聚焦 DataGrid。我怎样才能解决这个问题?

System.Windows.Controls.DataGrid

编辑:这是我正在谈论的 DataGrid 按钮的 Excel 模拟。这不是一个真正的按钮,而是某种标题:

在此处输入图像描述

4

2 回答 2

4

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

在此处输入图像描述

因此,您可以将事件处理程序写入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();           
}
于 2013-01-24T21:14:17.850 回答
3

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

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

如果选择了所有单元格,这也使我能够实现取消全选。

于 2014-03-07T13:39:12.087 回答