J'ai un Expander dans le ItemTemplate d'un ListBox. Rend bien. Le problème que j'ai rencontré est que je voudrais que l'événement ListBox_SelectionChanged se déclenche lorsque l'expandeur est développé et/ou sélectionné. L'événement MouseDown ne semble pas atteindre le ListBox.Événements WPF Listbox + Expander
Ce dont j'ai besoin est SelectedIndex de la ListBox. Parce que le ListBox_SelectionChanged n'est pas déclenché, l'index est -1 et je ne peux pas déterminer quel élément a été sélectionné. L'événement ListBox_SelectionChanged est déclenché si un utilisateur clique sur le contenu de l'Expander après qu'il a été développé. Si elles ne cliquent que sur l'expandeur, l'événement n'est pas déclenché. Ceci est déroutant pour l'utilisateur car visuellement, ils pensent qu'ils ont déjà cliqué sur cet élément en cliquant sur l'entête Expander. J'ai besoin de l'élément ListBox sélectionné lorsque l'utilisateur développe l'Expander car, en ce qui concerne l'utilisateur, l'élément est maintenant sélectionné quand ce n'est pas le cas.
Des suggestions sur comment faire fonctionner ceci ou d'autres manières de déterminer le SelectedIndex de la zone de liste avec des expandeurs dedans?
Code simplifié pour référence:
<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>
classe simple pour Reliure:
public class Person
{
public string Name {
get;
set;
}
public int Age {
get;
set;
}
}
Création et peuplant les données pour la liaison:
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;
}
C'est l'événement dont j'ai besoin (vraiment juste le SelectedIndex dont j'ai besoin)
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 oui - c'est logique et ça marche! Merci. – IUnknown
Cela fonctionne maintenant - mais avec un effet secondaire indésirable. Quand j'élargis un deuxième Expander, le premier s'effondre automatiquement. Y at-il un moyen de le faire sans automatiquement réduire l'élément développé précédent? – IUnknown
Il suffit de faire SelectionMode = "Multiple" sur le ListBox –