2010-08-27 2 views
31

У меня есть ListView, который содержит два типа объектов, одно и несколько. Сингл - обычный TextBlock, а multiple - это ComboBox с элементами.Группировка элементов в ComboBox

Я пытаюсь сгруппировать элементы в ComboBox без успеха. Является ли это возможным? Или я должен пойти на другой подход?

То, что я пытаюсь достичь:

[ComboBox v] 
    [Header ] 
    [ Item] 
    [ Item] 
    [Header ] 
    [ Item] 
+1

больше походит на TreeView мне. – strattonn

+2

Я согласен ... Сначала я создал дерево, но конечный пользователь хочет комбобокс ... – debe

ответ

51

Это возможно. Используйте ListCollectionView с GroupDescription как ItemsSource и просто предоставляйте GroupStyle для вашего ComboBox. Смотрите образец ниже:

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-за:

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; } 
    } 

} 
+2

Спасибо, что помогли нам в этом! Помогли! Бог благословил. – Tony

+0

Я пробовал ваше решение, и оно работает. Но я не могу получить выбранное значение, я попытался использовать combobox.SelectedItem.ToString(), но он не возвращает ожидаемый результат. У вас есть идея? thx – Bluety

+0

Извините за двухлетнюю задержку Bluety, но у меня была аналогичная проблема, потому что мое базовое свойство (строка) не соответствовало типу SelectedItem (мой класс Item), и привязка никогда не происходила. Привязка к SelectedValue вместо SelectedItem решила проблему – Sean