WPF DataGrid左上角选择所有标题按钮不对焦网格

时间:2013-01-24 16:33:08

标签: c# .net wpf datagrid

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

但是,我的用户遇到了麻烦,因为这个“按钮”没有关注DataGrid。我该如何解决这个问题?

System.Windows.Controls.DataGrid

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

enter image description here

2 个答案:

答案 0 :(得分: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();           
}

答案 1 :(得分:2)

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

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

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