2010-08-27 18 views
31

Tek ve çok, iki tür nesne içeren bir ListView'im var. Tek, sıradan bir TextBlock'tur, çoklu ise öğeler içeren bir ComboBox'dur.Bir ComboBox'ta öğeleri gruplandırma

Bileşenleri ComboBox'ta başarılı bir şekilde gruplandırmaya çalışıyorum. Mümkün mü? Yoksa farklı bir yaklaşım için mi gitmeliyim?

elde etmek çalışıyorum Ne:

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

Bana daha çok TreeView gibi geldi. – strattonn

+2

Katılıyorum ... İlk önce bir ağaç manzarası yaptım ama son kullanıcı bir combobox istiyor ... – debe

cevap

51

mümkündür. Bir GroupDescription ile ItemsSource olarak bir ListCollectionView kullanın ve ComboBox'ınıza bir GroupStyle sağlayın. aşağıdaki örneğe bakı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> 

kod arkadaki:

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

Bize yardımcı olduğunuz için teşekkür ederiz! Çok yardımcı oldu! Tanrı kutsasın. – Tony

+0

Çözümünüzü ve çalışmalarınızı denedim. Ama seçilen değeri alamıyorum, combobox.SelectedItem.ToString() ile denedim ama beklenen sonucu döndürmez. Bir fikrin var mı? thx – Bluety

+0

İki yıllık gecikme için üzgünüm Bluety, ama benzer bir sorun vardı, çünkü temel mülküm (string), SelectedItem türüyle eşleşmiyordu (Öğe sınıfım) ve ciltleme hiç gerçekleşmedi. SelectedItem yerine SelectedValue'a bağlanma sorunu çözüldü – Sean

İlgili konular