リストボックスがあり、データテンプレートにエキスパンダーがあります。
エキスパンダー ヘッダーをクリックすると、エキスパンダーはコンテンツ ゾーンを展開しますが、親の ListBoxItem を選択しません。
Expander の Expanded Content Zone をクリックすると、親の ListBoxItem が選択されます。
expanderHeader をクリックすると、コンテンツが展開され、親リストボックス項目が選択されるようにする方法は?
リストボックスがあり、データテンプレートにエキスパンダーがあります。
エキスパンダー ヘッダーをクリックすると、エキスパンダーはコンテンツ ゾーンを展開しますが、親の ListBoxItem を選択しません。
Expander の Expanded Content Zone をクリックすると、親の 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>