2013-01-24 41 views
3

我的控件使用WPF DataGrid。如果您单击左上角的空头,则会选择所有行。这是DataGrid的标准部分,而不是我添加的任何东西。WPF DataGrid左上角选择所有标题按钮不会聚焦网格

但是,我的用户遇到麻烦,因为这个'按钮'不会聚焦DataGrid。我怎样才能解决这个问题?

System.Windows.Controls.DataGrid

编辑:这是DataGrid的按键我谈论的Excel的模拟。这是不是一个真正的按钮,但有些类型的标题:

enter image description here

+0

哪个按钮? – iltzortz

回答

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

这也让我有能力实现如果所有单元格都被选中,全部取消选择。

+0

更好的解决方案我会说,但我想也许你应该删除额外的代码来取消选择单元格,因为它不是OP所询问的。没有这一点,你会得到一个非常明确和简单的答案,比接受的答案更具说明性。 从你的回答中我不清楚的一件事是,即使你设置e.Handled为false,你仍然必须执行myGrid.SelectAll()以使其工作。 –