在 ComboBox 中对项目进行分组

Posted

技术标签:

【中文标题】在 ComboBox 中对项目进行分组【英文标题】:Grouping items in a ComboBox 【发布时间】:2011-04-04 20:13:15 【问题描述】:

我有一个 ListView,其中包含两种类型的对象,单个和多个。 单个是一个普通的 TextBlock,而多个是一个带有项目的 ComboBox。

我正在尝试对 ComboBox 中的项目进行分组,但没有成功。可能吗?还是我应该采用不同的方法?

我想要达到的目标:

[ComboBox v]
    [Header  ]
    [    Item]
    [    Item]
    [Header  ]
    [    Item]

【问题讨论】:

对我来说听起来更像 TreeView。 我同意...我先做了一个树形视图,但最终用户想要一个组合框... 【参考方案1】:

这是可能的。使用带有 GroupDescription 的 ListCollectionView 作为 ItemsSource,只需为您的 ComboBox 提供 GroupStyle。请参阅下面的示例:

XAML:

<Window x:Class="***.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:***"
        xmlns:uc="clr-namespace:***.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>

代码隐藏:

namespace ***

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


【讨论】:

感谢您帮助我们!帮助很大!上帝保佑。 我试过你的解决方案,它的工作原理。但是我无法获得选定的值,我尝试使用 combobox.SelectedItem.ToString() 但它没有返回预期的结果。你有想法吗 ?谢谢 抱歉,Bluety 延迟了两年,但我遇到了类似的问题,因为我的基础属性(字符串)与 SelectedItem 类型(我的 Item 类)不匹配,并且从未发生绑定。绑定到 SelectedValue 而不是 SelectedItem 解决了问题 其实绑定SelectedValue而不是SelectedItem可以解决问题,但是不会携带组信息。将绑定的属性类型更改为 Item 类修复了它。 这太棒了。但我发现它有点令人困惑,因为 Header Template 和 Item Template 都绑定到一个名为“Name”的属性。如果将 Item.Name 属性重命名为(例如)Item.Description 会更清楚,然后在 XAML 中,Header Template 将绑定到 ListCollectionView 中的隐式“Name”属性,并且 Item Template 将绑定到“描述”。尽管如此,还是很好的例子 - 谢谢。

以上是关于在 ComboBox 中对项目进行分组的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Google Cloud Platform 中对服务帐户进行分组?

如何获取 ComboBox 的值?

如何在c#中对所有日志进行分组

如何在 ASP.NET MVC 视图中对数据进行分组?

管理文件的技术方法 - 在 xcode 中对文件进行分组

如何从相关表中对 SQL 中的结果进行分组?