Эта статья SO описывает, как вы можете выбрать контейнер элемента в ItemsControl и перемещаться по дереву, чтобы выбрать элемент, который вы хотите изменить (в данном случае фокусируясь на нем).
Пересмотр моего кода снизу:
public void WhateverMethodForShowingBusy ()
{
//Get a reference to your View
FrameworkElement myView = this.View; // I generally have a reference to the view living on the ViewModel set at construction time
// Get a reference to your ItemsControl - in this example by name
ListBox custListBox = myView.ListBoxName;
// Get the currently selected Item which will be a CustomerViewModel
// (not a DataTemplate or ListBoxItem)
CustomerViewModel cvm = custListBox.SelectedItem;
//Generate the ContentPresenter
ContentPresenter cp = custListBox.ItemContainerGenerator.ContainerFromItem(cvm) as ContentPresenter;
//Now get the button and focus it.
Button myButton = cp.FindName("MyButtonName");
myButton.Focus();
}
Приведенная ниже информация неверна на основании ошибки, что IsFocused был свойством чтения / записи, которое устанавливало бы фокус. Это не применимо.
Это еще одно место, где MVVM действительно хорошо работает. Если вы не знакомы с MVVM, я настоятельно рекомендую изучить его. Он решает множество подобных проблем и при правильной реализации может сделать ваш код более удобным для обслуживания.
Если вы используете подход MVVM, просто разместите логическое свойство (назовем его IsFocused) в ViewModel, который находится за DataTemplate. Например, у нас есть класс Customer, класс CustomerViewModel, который содержит экземпляр customer, а затем ваш MainViewModel, который содержит коллекцию CustomerViewModels. Свойство ItemsSource вашего ItemsControl привязано к коллекции CustomerViewModels, а свойство IsFocused кнопки DataTemplate привязано к свойству IsFocused в CustomerViewModel.
Я не уверен в вашем рабочем процессе, но вы можете сделать что-то вроде этого:
public void WhateverMethodForShowingBusy ()
{
//Get a reference to your View
FrameworkElement myView = this.View; // I generally have a reference to the view living on the ViewModel set at construction time
// Get a reference to your ItemsControl - in this example by name
ListBox custListBox = myView.ListBoxName;
// Get the currently selected Item which will be a CustomerViewModel
// (not a DataTemplate or ListBoxItem)
CustomerViewModel cvm = custListBox.SelectedItem;
//Finally set the property.
cvm.IsFocused = true;
}
Как и во всех вещах в MVVM, убедитесь, что вы реализуете INotifyPropertyChanged.