Группировка элементов в ComboBox
У меня есть ListView, который содержит два типа объектов, один и несколько. Сингл - это обычный TextBlock, а множественный - это ComboBox с элементами.
Я пытаюсь сгруппировать элементы в ComboBox безуспешно. Является ли это возможным? Или я должен пойти на другой подход?
Чего я пытаюсь добиться:
[ComboBox v]
[Header ]
[ Item]
[ Item]
[Header ]
[ Item]
2 ответа
Решение
Это возможно. Используйте ListCollectionView с GroupDescription в качестве ItemsSource и просто предоставьте GroupStyle для вашего ComboBox. Смотрите образец ниже:
XAML:
<Window x:Class="Stackru.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Stackru"
xmlns:uc="clr-namespace:Stackru.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>
Код-за:
namespace Stackru
{
/// <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; }
}
}
Вот улучшение ответа ASanch, чтобы сделать его дружественным к MVVM, где вы привязываетесь к CollectionView.
Посмотреть модель:
namespace StackOverflow
{
public class MainViewModel : INotifyPropertyChanged
{
public ObservableCollection<Item> Items { get; set; }
public CollectionViewSource CollectionView { get; set; }
public MainViewModel()
{
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" });
Items = new ObservableCollection<Item>(items);
var view = new CollectionViewSource();
view.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
view.Source = Items;
CollectionView = view;
}
public CollectionViewSource CollectionView { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
public class Item
{
public string Name { get; set; }
public string Category { get; set; }
}
}
КСАМЛ:
<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">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<StackPanel>
<ComboBox ItemsSource="{Binding CollectionView.View}" DisplayMemberPath="Name">
<ComboBox.GroupStyle>
<GroupStyle/>
</ComboBox.GroupStyle>
</ComboBox>
</StackPanel>
</Window>