Tengo un expansor en la ItemTemplate de un ListBox. Renders bien. El problema que me he encontrado es que me gustaría que el evento ListBox_SelectionChanged se dispare cuando se expande y/o selecciona el expansor. El evento MouseDown no parece burbujear hasta el ListBox.WPF Listbox + Expander events
Lo que necesito es el SelectedIndex del ListBox. Como ListBox_SelectionChanged no se activa, el índice es -1 y no puedo determinar qué elemento se ha seleccionado.
El evento ListBox_SelectionChanged se activa si un usuario hace clic en el contenido del expansor una vez que se ha expandido. Si solo hacen clic en el expansor, el evento no se dispara. Esto es confuso para el usuario porque, a simple vista, piensan que ya han hecho clic en ese elemento al hacer clic en el encabezado del expansor. Necesito el elemento ListBox seleccionado cuando el usuario expande el expansor porque, en lo que respecta al usuario, ahora el elemento está seleccionado cuando realmente no lo está.
¿Alguna sugerencia sobre cómo hacer que esto funcione o formas alternativas de determinar el SelectedIndex del cuadro de lista con expansores en él?
código simplificado para referencia:
<Window x:Class="WpfApplication3.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Loaded="Window_Loaded">
<Grid Name="Root">
<ScrollViewer>
<ListBox SelectionChanged="ListBox_SelectionChanged" ItemsSource="{Binding}">
<ItemsControl.ItemTemplate >
<DataTemplate>
<Border>
<Expander>
<Expander.Header>
<TextBlock Text="{Binding Path=Name}"/>
</Expander.Header>
<Expander.Content>
<StackPanel>
<TextBlock Text="{Binding Path=Age}"/>
<TextBlock Text="Line 2"/>
<TextBlock Text="Line 3"/>
</StackPanel>
</Expander.Content>
</Expander>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
</ScrollViewer>
</Grid>
</Window>
clase simple para Encuadernación:
public class Person
{
public string Name {
get;
set;
}
public int Age {
get;
set;
}
}
Crear y llenar los datos para la unión:
private void Window_Loaded(object sender, RoutedEventArgs e) {
data = new ObservableCollection<Person>();
data.Add(new Person {
Name = "One",
Age=10
});
data.Add(new Person {
Name = "Two",
Age = 20
});
data.Add(new Person {
Name = "Three",
Age = 30
});
Root.DataContext = data;
}
Este es el evento que necesito (realmente solo el SelectedIndex que necesito)
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {
ListBox box = (ListBox)sender;
// This value is not set because events from Expander are not bubbled up to fire SelectionChanged Event
int index = box.SelectedIndex;
}
Ahh sí - ¡eso tiene sentido y funciona! Gracias. – IUnknown
Funciona ahora, pero con un efecto secundario no deseado. Cuando expando un segundo Expansor, el primero se colapsa automáticamente. ¿Hay alguna manera de hacerlo sin colapsar automáticamente el elemento expandido anterior? – IUnknown
Simplemente haga SelectionMode = "Multiple" en el ListBox –