2010-08-27 11 views
31

Tengo un ListView que contiene dos tipos de objetos, uno y varios. El único es un TextBlock ordinario, mientras que el múltiple es un ComboBox con elementos.Agrupación de elementos en un ComboBox

Estoy tratando de agrupar los elementos en el ComboBox sin éxito. ¿Es posible? ¿O debería elegir un enfoque diferente?

lo que estoy tratando de lograr:

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

suena más como un TreeView para mí. – strattonn

+2

Estoy de acuerdo ... Hice una vista de árbol primero, pero el usuario final quiere un combobox ... – debe

Respuesta

51

Es posible. Use un ListCollectionView con una GroupDescription como ItemsSource y simplemente proporcione un GroupStyle a su ComboBox. Vea el ejemplo a continuación:

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> 

de código subyacente:

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

¡Gracias por ayudarnos con esto! ¡Ayudó mucho! Dios bendiga. – Tony

+0

Probé su solución y funciona. Pero no puedo obtener el valor seleccionado, lo intenté con combobox.SelectedItem.ToString() pero no devuelve el resultado esperado. Tienes una idea ? thx – Bluety

+0

Perdón por el retraso de dos años Bluety, pero tuve un problema similar porque mi propiedad subyacente (cadena) no coincidía con el tipo SelectedItem (mi clase de artículo) y nunca se realizó la vinculación. La vinculación a SelectedValue en lugar de SelectedItem resolvió el problema – Sean