Вы можете добавить обработчик к событию GotFocus в TextBox, который устанавливает выбранный элемент в ListView. Вы можете использовать ItemsControl.ContainerFromElement , чтобы получить ListViewItem, и ItemContainerGenerator.ItemFromContainer , чтобы получить связанный объект данных. В XAML:
<TextBox GotFocus="tbName_GotFocus" Name="tbName" Text="{Binding Path=Username, ValidatesOnDataErrors=True}"/>
В коде позади:
private void tbName_GotFocus(object sender, RoutedEventArgs e)
{
var container = lstRecipients.ContainerFromElement((DependencyObject)sender);
if (container != null)
{
lstRecipients.SelectedItem = lstRecipients.ItemContainerGenerator
.ItemFromContainer(container);
}
}
Вы также можете установить обработчик в ListView, поскольку GotFocus является перенаправленным событием. Вы можете использовать это для создания обработчика, который может быть разделен между ListViews. В XAML:
<ListView GotFocus="lstRecipients_GotFocus" Name="lstRecipients" ItemsSource="{Binding Path=Recipients}">
В коде позади:
private void lstRecipients_GotFocus(object sender, RoutedEventArgs e)
{
var selector = sender as Selector;
if (selector != null)
{
var container = selector.ContainerFromElement
((DependencyObject)e.OriginalSource);
if (container != null)
{
selector.SelectedItem = selector.ItemContainerGenerator
.ItemFromContainer(container);
}
}
}
(Если вы не хотите, чтобы TextBox вообще мог редактироваться, вы также можете просто установить Focusable="False"
или использовать TextBlock вместо TextBox, и фокус перейдет к ListView и выберет строку при нажатии на ячейку. .)