2

我有一个列表框,在数据模板中我有一个扩展器。

如果我单击扩展器标题,扩展器会扩展内容区域,但不会选择父 ListBoxItem。

如果我单击扩展器的扩展内容区域,则会选中父 ListBoxItem。

如何在单击 expanderHeader 时使内容展开并选中父列表框项?

4

4 回答 4

9

我意识到这个问题已经得到解答,但是有一种更简单的方法可以实现这个预期的结果。您可以添加一个Trigger,只要其中的元素具有键盘焦点ListBoxItem Style,就会选择:ListBoxItemItemTemplate

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

有关详细信息,请查看MSDNpost1post2

于 2011-12-04T22:15:00.667 回答
1

我遇到了同样的问题,并通过侦听 ListBox 上的 PreviewGotKeyboardFocus 事件来处理它。当焦点改变时,遍历可视化树寻找 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;
    }
于 2011-04-09T04:54:02.463 回答
0

你不能用这个Expanded事件吗?

就像是

<Expander Expanded="Expander_Expanded"

private void Expander_Expanded(object sender, RoutedEventArgs e)
{
    parentListBox.Focus();
}
于 2011-03-04T13:43:06.770 回答
0

您可以做的是将 Expander 的 IsExpanded 属性直接与 ListBoxItem 的 IsSelected 属性绑定。但这意味着,您只需选择扩展器也会扩展的项目......这也意味着未选择的项目永远不会扩展。

例子:

  <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>
于 2011-03-04T13:53:49.527 回答