基于ICollectionView實(shí)現(xiàn)
相關(guān)cs代碼:
[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班" },
};
MyView = CollectionViewSource.GetDefaultView(People);
var groupDescription
= new PropertyGroupDescription("Class");
MyView.GroupDescriptions.Add(groupDescription);
}
這段代碼使用了WPF中的CollectionViewSource
與PropertyGroupDescription
類來對(duì)數(shù)據(jù)進(jìn)行分組。
CollectionViewSource
是一個(gè)用于提供數(shù)據(jù)視圖的類,它允許你對(duì)數(shù)據(jù)進(jìn)行排序、篩選和分組。
GetDefaultView
方法返回一個(gè)默認(rèn)視圖,該視圖是對(duì)People
集合的包裝。這個(gè)視圖可以用于在UI中顯示數(shù)據(jù),并且可以應(yīng)用各種視圖操作(如排序、篩選和分組)。
PropertyGroupDescription
是一個(gè)用于定義分組規(guī)則的類。這里創(chuàng)建了一個(gè)新的PropertyGroupDescription
對(duì)象,并指定分組依據(jù)的屬性為Class
,這意味著數(shù)據(jù)將根據(jù)這意味著數(shù)據(jù)將根據(jù)People
集合中每個(gè)對(duì)象的Class
屬性值進(jìn)行分組。
xaml相關(guān)代碼:
<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
是用來自定義分組頭部的顯示方式。
GroupStyle
: 這是一個(gè)用于定義分組樣式的元素。它允許你為ui:ListView中的每個(gè)分組自定義外觀和行為。在這個(gè)元素內(nèi)部,你可以定義頭部模板(HeaderTemplate)、容器樣式(ContainerStyle)等。
GroupStyle.HeaderTemplate
: 這個(gè)元素定義了分組頭部的模板。通過這個(gè)模板,你可以自定義分組頭部的外觀。
實(shí)現(xiàn)的效果如下所示:
基于IGrouping實(shí)現(xiàn)
在將數(shù)據(jù)分組時(shí),我個(gè)人比較喜歡使用Linq的GroupBy。
相關(guān)cs代碼如下:
[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方法對(duì)People集合進(jìn)行分組。
GroupBy(x => x.Class)
的作用是根據(jù)People對(duì)象的Class屬性的值將這個(gè)集合分成多個(gè)組。每個(gè)組是一個(gè)包含有相同Class值的People對(duì)象集合。這里的x代表People集合中的每一個(gè)People對(duì)象,x => x.Class是一個(gè)lambda表達(dá)式,指定了分組的依據(jù)是People對(duì)象的Class屬性。
GroupBy
方法的結(jié)果是一個(gè)IEnumerable<IGrouping<string?, People>>
類型的對(duì)象。IGrouping<string?, People>
接口表示一個(gè)分組,其中string?是分組鍵的類型(在這個(gè)例子中是Class屬性的類型),People是集合中元素的類型。每個(gè)IGrouping<string?, People>對(duì)象包含一個(gè)鍵(Key屬性,即Class的值)和一個(gè)集合(包含所有具有該Class值的People對(duì)象)。
相關(guān)xaml代碼如下:
<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中的一個(gè)控件,中文通常翻譯為“擴(kuò)展器”或“可折疊控件”。它是一個(gè)容器控件,允許用戶通過點(diǎn)擊標(biāo)題欄來展開或折疊其內(nèi)容區(qū)域。這種控件在用戶界面設(shè)計(jì)中非常有用,可以用來隱藏或顯示詳細(xì)信息,從而節(jié)省屏幕空間。
實(shí)現(xiàn)效果如下所示:
回顧
本文介紹了遇到WPF對(duì)數(shù)據(jù)進(jìn)行分組顯示的需求時(shí),可以選擇的兩種方案。一種方案基于ICollectionView
,另一種方案基于IGrouping
。
基于ICollectionView
的方案,在cs代碼中通過CollectionViewSource.GetDefaultView
方法獲得集合的默認(rèn)視圖,創(chuàng)建一個(gè)PropertyGroupDescription
類,ICollectionView
的GroupDescriptions
屬性添加創(chuàng)建的PropertyGroupDescription
對(duì)象。在xaml代碼中,除了一般的數(shù)據(jù)綁定外,還添加了ListView.GroupStyle
,設(shè)置了GroupStyle.HeaderTemplate
。
基于IGrouping
的方案,在cs代碼中,使用Linq
的GroupBy
方法對(duì)People集合進(jìn)行分組。在xaml代碼中在ListView
的數(shù)據(jù)模板中使用Expander
控件綁定分組的Key屬性,在Expander
控件中再包含一個(gè)ListView
控件,綁定每個(gè)分組中的數(shù)據(jù)項(xiàng)。
轉(zhuǎn)自https://www.cnblogs.com/mingupupu/p/18256035
該文章在 2024/6/20 11:26:48 編輯過