我的控件使用WPF DataGrid。如果单击左上角的空标题,则会选择所有行。这是DataGrid的标准部分,而不是我添加的任何内容。
但是,我的用户遇到了麻烦,因为这个“按钮”没有关注DataGrid。我该如何解决这个问题?
System.Windows.Controls.DataGrid
编辑:这是我正在讨论的DataGrid按钮的Excel模拟。这不是一个真正的按钮,而是某种类型的标题:
答案 0 :(得分: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();
}
答案 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;
}
如果选择了所有单元格,这也使我能够实现取消选择。