如果使用数据绑定,如何在加载时正确地将焦点设置为ListBox?

PRI*_*UFF 6 data-binding wpf listbox focus

我通常调用myControl.Focus()Loaded事件处理程序,但这似乎不适用于数据ListBox绑定到自定义对象列表.当我启动我的应用程序时,ListBox第一个项目被选中但焦点在其他地方.

我认为这可能是因为焦点是在数据绑定项加载到它之前设置的......但是下面的代码显示确实存在项目因为ctrlItemsCount显示数字8.

如何在这种情况下设置初始焦点,通常设置初始焦点的正确位置是什么?

private void onLoad(object sender, RoutedEventArgs e) {
        if (ctrlCountries.Items.Count > 0) {
             ctrlItemsCount.Text = ctrlCountries.Items.Count;
             ctrlCountries.SelectedIndex = 0;
             FocusManager.SetFocusedElement(this, ctrlCountries);
        }

  }
Run Code Online (Sandbox Code Playgroud)

编辑:我已将此代码移动到实际ListBox本身的加载事件.它几乎可以工作 - 现在重点是ListBox,但是我仍然需要在项目#0具有键盘光标之前按下键盘一次.换句话说,由于某种原因,焦点或光标在项目#0上方1个档位:

private void onCountriesLoaded(object sender, RoutedEventArgs e) {
    ctrlCountries.SelectedIndex = 0;
    FocusManager.SetFocusedElement(this, ctrlCountries);
    Keyboard.Focus();
}
Run Code Online (Sandbox Code Playgroud)

oll*_*SFT 10

如果要将第一个元素聚焦在列表框中,则必须将焦点设置为第一个ListBoxItem容器.例如:

if (myListBox.Items.Count > 0)
{ 
   ListBoxItem item = (ListBoxItem)myListBox.ItemContainerGenerator.ContainerFromIndex(0);
   FocusManager.SetFocusedElement(this /* focus scope region */, item);
}
Run Code Online (Sandbox Code Playgroud)

但是,您仍然必须确保ListBox控件首次收到其Loaded事件.还有许多其他事件可用于处理与列表框项相关的更新.看一下MSDN 中的ItemContainerGenerator.