У меня есть Expander в ItemTemplate ListBox. Рендеринг прекрасен. Проблема, с которой я столкнулся, заключается в том, что я хотел бы, чтобы событие ListBox_SelectionChanged срабатывало при раскрытии и / или выборе расширителя. Событие MouseDown, похоже, не всплывает до ListBox.
Мне нужен SelectedIndex ListBox. Поскольку ListBox_SelectionChanged не запускается, индекс равен -1, и я не могу определить, какой элемент был выбран.
Событие ListBox_SelectionChanged запускается, если пользователь нажимает на Содержимое расширителя после того, как оно было развернуто. Если они щелкают только по расширителю, событие не запускается. Это сбивает пользователя с толку, потому что визуально он думает, что уже щелкнул этот элемент, когда на самом деле щелкает заголовок Expander. Мне нужно, чтобы элемент ListBox был выбран, когда пользователь разворачивает Expander, потому что с точки зрения пользователя элемент теперь выбран, хотя на самом деле это не так.
Любые предложения о том, как заставить это работать, или альтернативные способы определения SelectedIndex списка с расширителями в нем?
Упрощенный код для справки:
<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>
Простой класс для привязки:
public class Person
{
public string Name {
get;
set;
}
public int Age {
get;
set;
}
}
Создание и заполнение данных для привязки:
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;
}
Это событие, которое мне нужно (на самом деле, мне нужен только SelectedIndex)
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;
}