I have a ListView that contains two types of objects, single and multiple. The single is a ordinary TextBlock while the multiple is a ComboBox with items.
I'm trying to group the items in the ComboBox without success. Is it possible? Or should I go for a different approach?
What I'm trying to achieve:
[ComboBox v] [Header ] [ Item] [ Item] [Header ] [ Item]
To enable the grouping functionality in the ComboBox, use the remote transport and a grouped data source. By default, the grouped data of the ComboBox will be sorted either in ascending or descending order. To group the data in a specific order, use the server grouping configuration.
A combobox is a selection control that combines a non-editable textbox and a drop-down listbox that allows users to select an item from a list. It either displays the current selection or is empty if there is no selected item.
It is possible. Use a ListCollectionView with a GroupDescription as the ItemsSource and just provide a GroupStyle to your ComboBox. See sample below:
XAML:
<Window x:Class="StackOverflow.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:StackOverflow" xmlns:uc="clr-namespace:StackOverflow.UserControls" Title="MainWindow" Height="350" Width="525"> <StackPanel> <ComboBox x:Name="comboBox"> <ComboBox.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <TextBlock Text="{Binding Name}"/> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ComboBox.GroupStyle> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}"/> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </StackPanel> </Window>
Code-behind:
namespace StackOverflow { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //this.comboBox.DataContext = this; List<Item> items = new List<Item>(); items.Add(new Item() { Name = "Item1", Category = "A" }); items.Add(new Item() { Name = "Item2", Category = "A" }); items.Add(new Item() { Name = "Item3", Category = "A" }); items.Add(new Item() { Name = "Item4", Category = "B" }); items.Add(new Item() { Name = "Item5", Category = "B" }); ListCollectionView lcv = new ListCollectionView(items); lcv.GroupDescriptions.Add(new PropertyGroupDescription("Category")); this.comboBox.ItemsSource = lcv; } } public class Item { public string Name { get; set; } public string Category { get; set; } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With