Использование синтаксиса привязки в C # не будет работать, потому что так описываются привязки в XAML. Это может сработать для создания нового экземпляра System.Windows.Data.Binding
и установки его свойств, эквивалентного тому, что вы установили бы в XAML, но я не уверен, к какому ElementName
вы сможете привязаться, чтобы получить это работает правильно.
Единственный другой вариант, о котором я могу подумать, - это добавить обработчик для события SelectionChanged
и установить фокус вручную, но это не похоже на то решение, которое вам нужно.
При дальнейшем осмотре я не думаю, что решение Binding возможно. FocusManager.FocusedElement
- это IInputElement
, в котором нет членов, связанных с привязкой. Я думаю, что вам нужно пройти по визуальному дереву, чтобы найти первый объект, который можно сфокусировать. Примерно так должно работать:
// Event handler for the ListBox.SelectionChanged event
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox listBox = sender as ListBox;
ItemContainerGenerator = generator.listBox.ItemContainerGenerator;
ListBoxItem selectedItem =
(ListBoxItem)generator.ContainerFromIndex(listBox.SelectedIndex);
IInputElement firstFocusable = FindFirstFocusableElement(selectedItem);
firstFocusable.Focus();
}
private IInputElement FindFirstFocusableElement(DependencyObject obj)
{
IInputElement firstFocusable = null;
int count = VisualTreeHelper.GetChildrenCount(obj);
for(int i = 0; i < count && null == firstFocusable; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
IInputElement inputElement = child as IInputElement;
if(null != inputElement && inputElement.Focusable)
{
firstFocusable = inputElement;
}
else
{
firstFocusable = FindFirstFocusableElement(child);
}
}
return firstFocusable;
}