WPF: Как ListBoxItem может быть выбран, когда один из его элементов управления получает фокус? - PullRequest
2 голосов
/ 04 августа 2011

Глядя на следующее изображение, вы видите, что TextBox в четвертом ListBoxItem имеет Focus и KeyboardFocus, а второй ListBoxItem выбран.

Я знаю, что могу поймать событие GotFocus в Textbox, захватить его DataContext и установить свойство IsSelected связанного объекта, чтобы ListBoxItem стал выбранным.

Мне интересно, возможно ли этополучить ListBoxItem выбран, когда пользователь нажимает любой элементов управления, которые он содержит?Я спрашиваю об этом, потому что у меня есть несколько сложный TreeView с кучей элементов управления, и я ищу простой или элегантный способ выбора TreeViewItem всякий раз, когда пользователь нажимает на него где-либо.

enter image description here

ОБНОВЛЕНИЕ:

Я принял ответ Рэйчел, поскольку он отлично работает с ListBox, и он привел меня к решению, которое, кажется, поддерживает мой TreeView:прослушивайте событие GotFocus в TreeViewItems, а когда событие происходит, установите для e.Handled значение true, чтобы предотвратить пузыри события до предков выбранного в настоящий момент TreeViewItem

Xaml:

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <EventSetter Event="GotFocus" Handler="TVI_GotFocus"/>
            ...

C #:

    void TVI_GotFocus(object sender, RoutedEventArgs e)
    {
        e.Handled = true;
        if (!(sender is TreeViewItem))
            return;
        if (((TreeViewItem)sender).IsSelected)
            return;
        ((TreeViewItem)sender).IsSelected = true;
    }

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

Вы также должны иметь возможность настроить триггер на ListBoxItem.IsKeyboardFocusWithin и избегать любого кода позади:

<Style TargetType="ListBoxItem">
  <Style.Triggers>
    <Trigger Property="IsKeyboardFocusWithin" Value="True">
      <Setter Property="IsSelected" Value="True" />
    </Trigger>
  </Style.Triggers>
</Style>
1 голос
/ 04 августа 2011

Поместите это в ваш ListBox.Resources

<Style TargetType="{x:Type ListBoxItem}">
    <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
</Style>

И это в коде позади

protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
    ListBoxItem item = (ListBoxItem)sender;
    item.IsSelected = true;
}
...