C# 未在UserControl WPF中设置焦点

C# 未在UserControl WPF中设置焦点,c#,wpf,C#,Wpf,我无法在用户控件项上设置焦点 我在用户控制中使用DataGrid 我想把焦点放在DataGrid的第一行上 我发现了以下代码 int index = 0; dgAccountInfo.SelectedItem = winAccountInfoGrid.dgAccountInfo.Items[index]; dgAccountInfo.ScrollIntoView(winAccountInfoGrid.dgAccountInfo.Items[index]); DataGridRow dgrow

我无法在用户控件项上设置焦点 我在用户控制中使用DataGrid 我想把焦点放在DataGrid的第一行上

我发现了以下代码

int index = 0;

dgAccountInfo.SelectedItem = winAccountInfoGrid.dgAccountInfo.Items[index];
dgAccountInfo.ScrollIntoView(winAccountInfoGrid.dgAccountInfo.Items[index]);

DataGridRow dgrow = (DataGridRow)dgAccountInfo.ItemContainerGenerator.ContainerFromIndex(index);

if (dgrow != null)
{
   dgAccountInfo.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next))
};
通过运行上述代码,我发现ContainerFromIndex方法总是返回null

为了消除空问题,我找到了以下链接

我使用上面的链接解决了空问题,但仍然没有将重点放在数据网格上


感谢您阅读我的问题

在您正在使用的代码中,您似乎正在将数据绑定到其他内容,如果您只想将焦点设置为第一项,则不需要这样做。如果您的唯一目的是设置datagrid的焦点(选定索引),那么这可以在一个代码块中完成

if (dgAccountInfo.HasItems){    
  dgAccountInfo.SelectedIndex = 0;
}
if构造确保您的datagrid中确实包含项(否则,下一行代码将抛出异常)。如果datagrid有项,它将在构造内部执行代码。如果datagrid没有项,它将跳过代码

即使您从未计划在datagrid中没有任何项,您也应该包含此if构造,以防发生某些事情

在if构造中,将datagrid的SelectedIndex设置为第一项。请记住,与列表框一样,datagrid是“基于零的”,这意味着第一项的索引为零。要在datagrid中不选择任何内容,请将所选索引设置为“-1”

最后,设置“SelectedIndex”比设置“SelectedItem”可靠得多,因为数据网格中的项目通常会更改

如果需要,如果您想在datagrid没有项的情况下执行其他操作,那么可以在上述代码中包含#else语句(就在endif上方)


我希望这有帮助

是的。我使用MSDN交叉检查我的语法。如果你知道一些我不知道的事情,那么编辑我的帖子或者在你的评论/回答中添加更正可能会更有效率。你将伪预处理器
#If
与代码块中的
If
语句混合在一起,在C#伪预处理器中只允许进行简单的检查,看看是否定义了符号。另外,在C#
=
中是赋值,而不是关系运算符
=
是相等的适当运算符。我觉得编辑代码是不合适的,因为它看起来根本不符合C#的标准。