Tôi có Expander trong ItemTemplate của ListBox. Người cho vay tốt. Vấn đề tôi gặp phải là tôi muốn sự kiện ListBox_SelectionChanged kích hoạt khi bộ mở rộng được mở rộng và/hoặc được chọn. Sự kiện MouseDown dường như không bong bóng lên ListBox.WPF Listbox + Expander events
Điều tôi cần là SelectedIndex của ListBox. Bởi vì ListBox_SelectionChanged không bị sa thải, chỉ mục là -1 và tôi không thể xác định mục nào đã được chọn.
Sự kiện ListBox_SelectionChanged được kích hoạt nếu người dùng nhấp vào Nội dung của Expander sau khi nó đã được mở rộng. Nếu họ chỉ bấm vào expander, sự kiện này không được kích hoạt. Điều này gây nhầm lẫn cho người dùng bởi vì trực quan, họ nghĩ rằng họ đã nhấp vào mục đó khi thực sự nhấp vào Tiêu đề Expander. Tôi cần mục ListBox được chọn khi người dùng mở rộng Expander bởi vì theo như người dùng quan tâm, mục này hiện được chọn khi nó thực sự không.
Bất kỳ đề xuất nào về cách làm việc này hoặc cách thay thế để xác định SelectedIndex của hộp danh sách có bộ mở rộng trong đó?
đang Giản để tham khảo:
<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>
Simple lớp cho Binding:
public class Person
{
public string Name {
get;
set;
}
public int Age {
get;
set;
}
}
Tạo và Populating dữ liệu cho ràng buộc:
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;
}
Đây là sự kiện tôi cần (thực sự chỉ là SelectedIndex tôi cần)
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 có - điều đó có ý nghĩa và hoạt động! Cảm ơn. – IUnknown
Nó hoạt động ngay bây giờ - nhưng với một tác dụng phụ không mong muốn. Khi tôi mở rộng Expander thứ hai, cái đầu tiên sẽ tự động sụp đổ. Có cách nào để làm điều này mà không tự động thu gọn mục mở rộng trước đó? – IUnknown
Chỉ cần làm cho SelectionMode = "Nhiều" trên ListBox –