2010-08-27 2 views
31

Ich habe eine ListView, die zwei Arten von Objekten enthält, Einzel- und Mehrfachobjekte. Die Single ist ein gewöhnlicher TextBlock, während das Multiple eine ComboBox mit Elementen ist.Gruppieren von Elementen in einer ComboBox

Ich versuche, die Elemente in der ComboBox ohne Erfolg zu gruppieren. Ist es möglich? Oder sollte ich einen anderen Ansatz wählen?

Was ich versuche zu erreichen:

möglich
[ComboBox v] 
    [Header ] 
    [ Item] 
    [ Item] 
    [Header ] 
    [ Item] 
+1

Klingt eher wie ein TreeView zu mir. – strattonn

+2

Ich stimme zu ... Ich habe zuerst eine Treeview erstellt, aber der Endbenutzer möchte eine Combobox ... – debe

Antwort

51

Es ist. Verwenden Sie eine ListCollectionView mit einer GroupDescription als ItemsSource und stellen Sie Ihrer ComboBox nur einen GroupStyle zur Verfügung. Siehe Beispiel unten:

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

} 
+2

Vielen Dank für Ihre Hilfe! Hat viel geholfen! Gott segne. – Tony

+0

Ich habe Ihre Lösung versucht und es funktioniert. Aber ich kann den ausgewählten Wert nicht abrufen, ich habe es mit combobox.SelectedItem.ToString() versucht, aber es gibt das erwartete Ergebnis nicht zurück. Haben sie eine Idee ? thx – Bluety

+0

Sorry für die zweijährige Verzögerung Bluety, aber ich hatte ein ähnliches Problem, weil meine zugrunde liegende Eigenschaft (String), nicht mit dem SelectedItem-Typ (meine Klasse Item) übereinstimmte und die Bindung nie stattgefunden hat. Bindung an SelectedValue anstelle von SelectedItem löste das Problem – Sean