Hello,
I am trying to display a list of expanders in a combo box. The basic functionality is there and working as expected. The combo box items source is bound to a dictionary<string, list<data>>.
However, there are a few issues that are problematic. If you run the example code, Item B contains 10 subitems, Item C contains 20 subitems and Item G contains 30 subitems.
- For items with a large number of subitems, when the expander is opened, the expander list box displays a vertical scrollbar but no thumb
- If you click in an expander list box vertical scrollbar area, the combo box closes
- When scrolling the combo box vertical scrollbar, I would like it to honor expander subitems when scrolling - currently it just scrolls to the next outer item (eg Item J, Item K, etc)
- If a subitem is clicked within an expanded expander, I would like the combo box to display that when the popup is closed (eg Item A - SubItem 4)
Any help or suggestions would be greatly appreciated.
Here is the xaml
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"><Grid><StackPanel Margin="5"><ComboBox Name="comboBox1" Margin="5"><ComboBox.ItemTemplate><DataTemplate><Expander Header="{Binding Key}"><ScrollViewer Name="PART_ScrollViewer" VerticalScrollBarVisibility="Visible"><ListBox HorizontalAlignment="Stretch" ItemsSource="{Binding Value}"><ListBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding Name}" ToolTip="{Binding Description}" /></DataTemplate></ListBox.ItemTemplate></ListBox></ScrollViewer></Expander></DataTemplate></ComboBox.ItemTemplate></ComboBox></StackPanel></Grid></Window>And here is the code behind. There is nothing of interest here. All it does it build the dictionary.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApplication1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); comboBox1.ItemsSource = getItems(); } private Dictionary<string, List<Data>> getItems() { Dictionary<string, List<Data>> items = new Dictionary<string, List<Data>>(); items.Add("Item A", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item B", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, new Data { Name = "SubItem 6", Description = "Item 6 Description" }, new Data { Name = "SubItem 7", Description = "Item 7 Description" }, new Data { Name = "SubItem 8", Description = "Item 8 Description" }, new Data { Name = "SubItem 9", Description = "Item 9 Description" }, new Data { Name = "SubItem 10", Description = "Item 10 Description" }, }); items.Add("Item C", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, new Data { Name = "SubItem 6", Description = "Item 6 Description" }, new Data { Name = "SubItem 7", Description = "Item 7 Description" }, new Data { Name = "SubItem 8", Description = "Item 8 Description" }, new Data { Name = "SubItem 9", Description = "Item 9 Description" }, new Data { Name = "SubItem 10", Description = "Item 10 Description" }, new Data { Name = "SubItem 11", Description = "Item 11 Description" }, new Data { Name = "SubItem 12", Description = "Item 12 Description" }, new Data { Name = "SubItem 13", Description = "Item 13 Description" }, new Data { Name = "SubItem 14", Description = "Item 14 Description" }, new Data { Name = "SubItem 15", Description = "Item 15 Description" }, new Data { Name = "SubItem 16", Description = "Item 16 Description" }, new Data { Name = "SubItem 17", Description = "Item 17 Description" }, new Data { Name = "SubItem 18", Description = "Item 18 Description" }, new Data { Name = "SubItem 19", Description = "Item 19 Description" }, new Data { Name = "SubItem 20", Description = "Item 20 Description" }, }); items.Add("Item D", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item E", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, new Data { Name = "SubItem 6", Description = "Item 6 Description" }, new Data { Name = "SubItem 7", Description = "Item 7 Description" }, new Data { Name = "SubItem 8", Description = "Item 8 Description" }, new Data { Name = "SubItem 9", Description = "Item 9 Description" }, new Data { Name = "SubItem 10", Description = "Item 10 Description" }, }); items.Add("Item F", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, new Data { Name = "SubItem 6", Description = "Item 6 Description" }, new Data { Name = "SubItem 7", Description = "Item 7 Description" }, new Data { Name = "SubItem 8", Description = "Item 8 Description" }, new Data { Name = "SubItem 9", Description = "Item 9 Description" }, new Data { Name = "SubItem 10", Description = "Item 10 Description" }, new Data { Name = "SubItem 11", Description = "Item 11 Description" }, new Data { Name = "SubItem 12", Description = "Item 12 Description" }, new Data { Name = "SubItem 13", Description = "Item 13 Description" }, new Data { Name = "SubItem 14", Description = "Item 14 Description" }, new Data { Name = "SubItem 15", Description = "Item 15 Description" }, new Data { Name = "SubItem 16", Description = "Item 16 Description" }, new Data { Name = "SubItem 17", Description = "Item 17 Description" }, new Data { Name = "SubItem 18", Description = "Item 18 Description" }, new Data { Name = "SubItem 19", Description = "Item 19 Description" }, new Data { Name = "SubItem 20", Description = "Item 20 Description" }, }); items.Add("Item G", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, new Data { Name = "SubItem 6", Description = "Item 6 Description" }, new Data { Name = "SubItem 7", Description = "Item 7 Description" }, new Data { Name = "SubItem 8", Description = "Item 8 Description" }, new Data { Name = "SubItem 9", Description = "Item 9 Description" }, new Data { Name = "SubItem 10", Description = "Item 10 Description" }, new Data { Name = "SubItem 11", Description = "Item 11 Description" }, new Data { Name = "SubItem 12", Description = "Item 12 Description" }, new Data { Name = "SubItem 13", Description = "Item 13 Description" }, new Data { Name = "SubItem 14", Description = "Item 14 Description" }, new Data { Name = "SubItem 15", Description = "Item 15 Description" }, new Data { Name = "SubItem 16", Description = "Item 16 Description" }, new Data { Name = "SubItem 17", Description = "Item 17 Description" }, new Data { Name = "SubItem 18", Description = "Item 18 Description" }, new Data { Name = "SubItem 19", Description = "Item 19 Description" }, new Data { Name = "SubItem 20", Description = "Item 20 Description" }, new Data { Name = "SubItem 21", Description = "Item 21 Description" }, new Data { Name = "SubItem 22", Description = "Item 22 Description" }, new Data { Name = "SubItem 23", Description = "Item 23 Description" }, new Data { Name = "SubItem 24", Description = "Item 24 Description" }, new Data { Name = "SubItem 25", Description = "Item 25 Description" }, new Data { Name = "SubItem 26", Description = "Item 26 Description" }, new Data { Name = "SubItem 27", Description = "Item 27 Description" }, new Data { Name = "SubItem 28", Description = "Item 28 Description" }, new Data { Name = "SubItem 29", Description = "Item 29 Description" }, new Data { Name = "SubItem 30", Description = "Item 30 Description" }, }); items.Add("Item H", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item I", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item J", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item K", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item L", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item M", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item N", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item O", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item P", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item Q", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item R", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item S", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item T", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item U", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item V", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item W", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item X", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item Y", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); items.Add("Item Z", new List<Data> { new Data { Name = "SubItem 1", Description = "Item 1 Description" }, new Data { Name = "SubItem 2", Description = "Item 2 Description" }, new Data { Name = "SubItem 3", Description = "Item 3 Description" }, new Data { Name = "SubItem 4", Description = "Item 4 Description" }, new Data { Name = "SubItem 5", Description = "Item 5 Description" }, }); return items; } } public class Data { public string Name { get; set; } public string Description { get; set; } } }