2010-08-27 31 views
31

Tôi có một ListView có chứa hai loại đối tượng, một và nhiều. Đĩa đơn là một TextBlock thông thường trong khi bội số là một ComboBox với các mục.Nhóm các mục trong một ComboBox

Tôi đang cố gắng nhóm các mục trong ComboBox mà không thành công. Có thể không? Hay tôi nên đi theo một cách tiếp cận khác?

Những gì tôi đang cố gắng để đạt được:

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

Âm thanh giống như một TreeView với tôi. – strattonn

+2

Tôi đồng ý ... Tôi đã tạo một lần xem trước đầu tiên nhưng người dùng cuối muốn có hộp kết hợp ... – debe

Trả lời

51

Có thể. Sử dụng ListCollectionView với GroupDescription làm ItemsSource và chỉ cung cấp GroupStyle cho ComboBox của bạn. Xem mẫu dưới đây:

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> 

Mã-đằng sau:

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

Cảm ơn bạn đã giúp chúng tôi với điều này! Giúp rất nhiều! Chúa phù hộ. – Tony

+0

Tôi đã thử giải pháp của bạn và nó hoạt động. Nhưng tôi không thể có được giá trị được chọn, tôi đã thử với combobox.SelectedItem.ToString() nhưng nó không trả lại kết quả mong đợi. Bạn có một ý tưởng ? thx – Bluety

+0

Xin lỗi cho sự chậm trễ hai năm Bluety, nhưng tôi đã có một vấn đề tương tự vì tài sản cơ bản của tôi (chuỗi), không phù hợp với loại SelectedItem (hạng mục của tôi) và ràng buộc không bao giờ xảy ra. Ràng buộc để SelectedValue thay vì SelectedItem giải quyết vấn đề – Sean

Các vấn đề liên quan