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

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

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

我想要达到的目标:

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

【问题讨论】:

  • 对我来说听起来更像 TreeView。
  • 我同意...我先做了一个树形视图,但最终用户想要一个组合框...

标签: wpf mvvm combobox collectionviewsource


【解决方案1】:

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

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>

代码隐藏:

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

}

【讨论】:

  • 感谢您帮助我们!帮助很大!上帝保佑。
  • 我试过你的解决方案,它的工作原理。但是我无法获得选定的值,我尝试使用 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 将绑定到“描述”。尽管如此,还是很好的例子 - 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2020-04-25
  • 2020-12-03
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多