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

У меня есть список и в табличке с данными у меня есть Expander.

Если я нажму на заголовок Expander, он расширит зону содержимого, но не выберет родительский ListBoxItem.

Если я щелкаю по Расширенной зоне содержимого Расширителя, родительский ListBoxItem становится выбранным.

Как сделать так, чтобы при нажатии на expanderHeader содержимое становилось расширенным И родительский элемент списка становился выбранным?

Ответы [ 4 ]

7 голосов
/ 05 декабря 2011

Я понимаю, что на этот вопрос был дан ответ, но есть гораздо более простой способ достичь этого желаемого результата.Вы можете добавить Trigger к ListBoxItem Style, который будет выбирать ListBoxItem всякий раз, когда элемент в его ItemTemplate имеет фокус клавиатуры:

<Style.Triggers> 
  <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
    <Setter Property="IsSelected" Value="True"/> 
  </Trigger> 
</Style.Triggers>

Для получения дополнительной информации см. MSDN или post1 или post2 .

1 голос
/ 09 апреля 2011

Я столкнулся с той же проблемой и обработал ее, прослушав событие PreviewGotKeyboardFocus в ListBox. При изменении фокуса обойдите визуальное дерево в поисках ListBoxItem и выберите его:

    private void ListBox_PreviewGotKeyboardFocus( object sender, KeyboardFocusChangedEventArgs e )
    {
        if( e.NewFocus is FrameworkElement )
        {
            ListBoxItem item = ( e.NewFocus as FrameworkElement ).FindParent<ListBoxItem>();
            if( item != null && !item.IsSelected )
            {
                item.IsSelected = true;
            }
        }
    }

    public static T FindParent<T>( this FrameworkElement element ) where T : FrameworkElement
    {
        DependencyObject current = element;

        while( current != null )
        {
            if( current is T )
            {
                return ( T ) current;
            }

            current = VisualTreeHelper.GetParent( current );
        }

        return null;
    }
0 голосов
/ 04 марта 2011

что вы можете сделать, это связать свойство IsExpanded Expander напрямую со свойством IsSelected объекта ListBoxItem. Но это означает, что вы просто выбираете элемент, который расширяет тоже расширитель ... И это также означает, что невыбранные элементы никогда не раскрываются.

пример:

  <ListBox>
    <ListBox.ItemTemplate>
      <DataTemplate>
        <Expander IsExpanded="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}">
          <TextBlock Text="bla bla" />
        </Expander>
      </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.Items>
      <DataObject />
      <DataObject />
    </ListBox.Items>
  </ListBox>
0 голосов
/ 04 марта 2011

вы не можете использовать событие Expanded для этого?

что-то вроде

<Expander Expanded="Expander_Expanded"

и

private void Expander_Expanded(object sender, RoutedEventArgs e)
{
    parentListBox.Focus();
}
...