Я думал, что добавлю свой собственный ответ, чтобы рассказать о том, что я узнал.Я сделал то, что не было показано в связанном ответе выше.
Итак, у меня есть DataTemplate:
<DataTemplate DataType="{x:Type Scratch:CollectionItem}">
<Grid Height="20" Width="288">
<TextBox HorizontalAlignment="Left" Margin="8,0,0,0" TextWrapping="Wrap" Text="{Binding Id}" VerticalAlignment="Top" Width="86" PreviewMouseDown="APreviewMouseDown" GotFocus="AGotFocus" GotKeyboardFocus="AGotKeyboardFocus" PreviewGotKeyboardFocus="AGotKeyboardFocus"/>
<TextBox Margin="98,0,0,0" TextWrapping="Wrap" Text="{Binding Detail}" VerticalAlignment="Top" PreviewMouseDown="APreviewMouseDown" GotFocus="AGotFocus" GotKeyboardFocus="AGotKeyboardFocus" PreviewGotKeyboardFocus="AGotKeyboardFocus"/>
</Grid>
Все события происходят, я в итоге остановился на GotFocus.Имена А * были откуда-то, где я пытался переименовать вещи, чтобы понять, почему события не запускались.Выход из Visual Studio и перезапуск, казалось, исправили это.Этот компьютер не очень надежен.
Как видите, DataTemplate предназначен для элементов типа CollectionItem.Я экспериментировал с коллекциями INotifyPropertyChanged и Observable.Детали не важны.
Мой ListBox связан с {Binding Path = Items}, где Items - ObservableCollection
Мое событие фокуса - это вариация решений, найденных в другом потоке.,Поскольку мой ListBox напрямую связан со списком объектов CollectionItem, следующее работает и выглядит чище, чем работа с шаблонным родителем и т. Д.
private void AGotFocus(object sender, RoutedEventArgs e)
{
try
{
FrameworkElement element = sender as FrameworkElement;
CollectionItem item = element.DataContext as CollectionItem;
if (item != null)
{
listBox2.SelectedValue = item;
}
}
catch { }
}
Так что в приведенном выше случае отправитель является одним из двух TextBoxего DataContext указывает на CollectionItem, и мы можем установить элемент списка, который будет выбран, выбрав этот элемент.
Не знаю, поможет ли это кому-нибудь, но оно есть:)