[ObservableProperty] private ObservableCollection<People> people; public GroupDemoViewModel() { People = new ObservableCollection<People> { new People { Name = "小一", Class = "1班" }, new People { Name = "小二", Class = "2班" }, new People { Name = "王五", Class = "1班" }, new People { Name = "小红", Class = "2班" }, new People { Name = "小绿", Class = "1班" }, new People { Name = "小刚", Class = "2班" }, }; // 堆代码 duidaima.com MyView = CollectionViewSource.GetDefaultView(People); var groupDescription = new PropertyGroupDescription("Class"); MyView.GroupDescriptions.Add(groupDescription); }这段代码使用了WPF中的CollectionViewSource与PropertyGroupDescription类来对数据进行分组。CollectionViewSource是一个用于提供数据视图的类,它允许你对数据进行排序、筛选和分组。GetDefaultView方法返回一个默认视图,该视图是对People集合的包装。这个视图可以用于在UI中显示数据,并且可以应用各种视图操作(如排序、筛选和分组)。
<ui:ListView ItemsSource="{Binding MyView}"> <ui:ListView.ItemTemplate> <DataTemplate > <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}" Margin="5"/> <TextBlock Text="{Binding Class}" Margin="5"/> </StackPanel> </DataTemplate> </ui:ListView.ItemTemplate> <ui:ListView.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="16"/> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ui:ListView.GroupStyle> </ui:ListView>GroupStyle和GroupStyle.HeaderTemplate是用来自定义分组头部的显示方式。
[ObservableProperty] private ObservableCollection<People> people; public IEnumerable<IGrouping<string?,People>> GroupedPeople { get; set; } public GroupDemoViewModel() { People = new ObservableCollection<People> { new People { Name = "小一", Class = "1班" }, new People { Name = "小二", Class = "2班" }, new People { Name = "王五", Class = "1班" }, new People { Name = "小红", Class = "2班" }, new People { Name = "小绿", Class = "1班" }, new People { Name = "小刚", Class = "2班" }, }; GroupedPeople = People.GroupBy(x => x.Class); } GroupedPeople = People.GroupBy(x => x.Class);这行代码使用LINQ的GroupBy方法对People集合进行分组。GroupBy(x => x.Class)的作用是根据People对象的Class属性的值将这个集合分成多个组。每个组是一个包含有相同Class值的People对象集合。这里的x代表People集合中的每一个People对象,x => x.Class是一个lambda表达式,指定了分组的依据是People对象的Class属性。
<ui:ListView ItemsSource="{Binding GroupedPeople}"> <ui:ListView.ItemTemplate> <DataTemplate > <Expander Header="{Binding Key}"> <ui:ListView ItemsSource="{Binding}"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}" Margin="5"/> <TextBlock Text="{Binding Class}" Margin="5"/> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate> </ui:ListView> </Expander> </DataTemplate> </ui:ListView.ItemTemplate> </ui:ListView>使用了Expander控件。Expander是WPF中的一个控件,中文通常翻译为“扩展器”或“可折叠控件”。它是一个容器控件,允许用户通过点击标题栏来展开或折叠其内容区域。这种控件在用户界面设计中非常有用,可以用来隐藏或显示详细信息,从而节省屏幕空间。