Wpf 如何强制键盘关注数据网格?

Wpf 如何强制键盘关注数据网格?,wpf,.net-4.0,datagrid,expander,keyboardfocusmanager,Wpf,.net 4.0,Datagrid,Expander,Keyboardfocusmanager,旧标题:GridView SelectCell+焦点/编辑中的操作不一致(GridView重新加载两次?) 我正在Expander的Content属性中开发一个GridView(由数据绑定)集。当我打开扩展器时,我希望第三列、第一个元素被选中并可编辑(但也可以简单地聚焦)。当我尝试将此功能添加到附加到Expanded的此操作时,网格从未为我选择第一项。我做了一些故障排除,奇怪的是,我注意到发生了一些事情。扩展器是ItemsCollection中模板的一部分,因此每次我将新项目添加到此ItemsC

旧标题:GridView SelectCell+焦点/编辑中的操作不一致(GridView重新加载两次?)

我正在Expander的Content属性中开发一个GridView(由数据绑定)集。当我打开扩展器时,我希望第三列、第一个元素被选中并可编辑(但也可以简单地聚焦)。当我尝试将此功能添加到附加到Expanded的此操作时,网格从未为我选择第一项。我做了一些故障排除,奇怪的是,我注意到发生了一些事情。扩展器是ItemsCollection中模板的一部分,因此每次我将新项目添加到此ItemsCollection时,都会在屏幕上创建扩展器(预设为IsExpanded=false)。我将Debug.WriteLine设置为Expander_Expanded事件和DataGrid.Loaded事件,以告知事件发生的时间。下面是这两个事件的代码

DataGrid.Loaded:

DataGrid dg = sender as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();
扩展器.扩展:

Expander expander = sender as Expander;
DataGrid dg = expander.Content as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();
当我创建一个包含扩展器的项目并将其显示在屏幕上时,DataGrid.Loaded事件将触发。第一次展开扩展器时,将触发expander.expanded事件以及DataGrid.Loaded事件。此后每隔一段时间,只有Expander.Expanded事件激发一次

第一次,[0][2]处的单元格聚焦并处于编辑模式。每隔一段时间,不选择/聚焦任何单元格。如果DataGrid.Loaded事件中没有代码,则无论是否是第一次打开扩展器,单元格都不会聚焦或处于编辑模式。Expander.Expanded实际上似乎并没有做任何事情,从选择的角度来看。作为记录,DataGrid的绑定工作得非常好,无论何时进行更改(无论是第一次打开扩展器还是随后的任何时间),数据都会正确更新。有人能解释一下吗

更新:

经过进一步调查,它与GridLoaded事件的关系不如与Keyboard.Focus的关系大。第一次加载DataGrid时,键盘焦点会转到我要求的单元格(以文本框的形式)。然而,每次之后,键盘的焦点仍然是打开扩展器本身的切换按钮。尝试设置Keyboard.Focus(dgCell)或Keyboard.Focus(dg)似乎没有任何作用,即使它们都是可聚焦的。当DataGrid打开时,我通过点击“回车”按钮来验证这个假设。如果DataGrid具有键盘焦点,则enter将移动到下一行。如果ToggleButton具有焦点,它将折叠扩展器


如前所述,第一次打开扩展器时,DataGrid具有键盘焦点,但每隔一次,焦点总是以按钮结束。有什么建议吗?

我通过稍后的活动解决了这个问题。使用扩展器触发键盘。焦点切换到按钮,在展开操作发生后切换扩展器(这使我的焦点切换工作无效)。因此,我使用了Expander_SizeChanged并添加了一个检查,以确保事件是由扩展器打开触发的,而不是由窗口本身的更改触发的。在这里设置焦点,然后选择我想要的单元格

下面是使其工作的代码(expandSomething是在Expander\u Expanded event listener上触发的布尔值)

Expander expander = sender as Expander;
if (expander.IsExpanded && expandSomething)
{
    expandSomething = false;
    DataGrid dg = expander.Content as DataGrid;
    dg.Focus();
    if (dg.SelectedCells.Count == 0)
    {
        dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
        dg.SelectedCells.Add(dg.CurrentCell);
    }
    else
    {
        dg.CurrentCell = dg.SelectedCells[0];
    }
}