我有一个列表框,在数据模板中我有一个扩展器。
如果我单击扩展器标题,扩展器会扩展内容区域,但不会选择父 ListBoxItem。
如果我单击扩展器的扩展内容区域,则会选中父 ListBoxItem。
如何在单击 expanderHeader 时使内容展开并选中父列表框项?
我有一个列表框,在数据模板中我有一个扩展器。
如果我单击扩展器标题,扩展器会扩展内容区域,但不会选择父 ListBoxItem。
如果我单击扩展器的扩展内容区域,则会选中父 ListBoxItem。
如何在单击 expanderHeader 时使内容展开并选中父列表框项?
我意识到这个问题已经得到解答,但是有一种更简单的方法可以实现这个预期的结果。您可以添加一个Trigger
,只要其中的元素具有键盘焦点ListBoxItem Style
,就会选择:ListBoxItem
ItemTemplate
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True"/>
</Trigger>
</Style.Triggers>
我遇到了同样的问题,并通过侦听 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;
}
你不能用这个Expanded
事件吗?
就像是
<Expander Expanded="Expander_Expanded"
和
private void Expander_Expanded(object sender, RoutedEventArgs e)
{
parentListBox.Focus();
}
您可以做的是将 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>