CollectionViewSource将一个项目分组为多个组
本文关键字:项目 CollectionViewSource 一个 | 更新日期: 2024-09-19 08:26:39
我正在尝试模拟msn-messenger联系人列表树视图显示。我有一个Contact对象,它有一个Groups属性,该属性返回Contact所属的msngroups数组,这意味着我有如下所示的东西
Class Contact
{
string Name;
string[] Groups {get;set;}
}
ObservableCollection<Contact> ContactList;
因此,一个联系人可以分为多个组,是否可以使用CollectionViewSource生成正确的视图来提供wpf TreeView?
当您将此层次结构展开时,分组将起作用,即"具有组的联系人"变为"具有每个组的重复联系人"。。。
例如
如果您有4个项目,并且分组类似。。。
Dog { mammal, quadruped }
Man { mammal, biped }
PrayingMantis { insect, quadruped }
Pegion { bird, biped }
那么您的新平面列表应该是这样的。。。
<mammal, Dog>
<mammal, Man>
<bird, Pigeon>
<insect, PrayingMantis>
<biped, Man>
<biped, Pigeon>
<quadruped, Dog>
<quadruped, PrayingMantis>
因此,在上面的Keys
上应用分组后,它应该是
mammal { Dog, Man }
bird { Pigeon }
insect { PrayingMantis }
biped { Man, Pigeon }
quadruped { Dog, PrayingMantis }
C#代码:
//Flatten the groups into a KeyValuePair<string, Contacts> list using LINQ.
var flatGroups
= listGroups.SelectMany(
ctc => ctc.Groups.Select(
grp => new KeyValuePair<string, Contact>(grp, ctc))).ToList();
//Apply CollectionViewSource group on the `Key`.
var collectionVwSrc = new CollectionViewSource();
collectionVwSrc.Source = flatGroups;
collectionVwSrc.GroupDescriptions.Add(new PropertyGroupDescription("Key"));
//Apply groups as itemssource to the TreeView.
MyGroupsTree.ItemsSource = collectionVwSrc.View.Groups;
XAML
<TreeView x:Name="MyGroupsTree">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Items}">
<!--GroupItem.Name-->
<TextBlock Text="{Binding Path=Name}"
FontWeight="Bold"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<!--Contact.Name-->
<TextBlock Text="{Binding Value.Name}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如果这有帮助,请告诉我。。。
////DataItem.cs
public class DataItem
{
public string Name { get; set; }
public string Path { get; set; }
public string[] GroupProperties { get; set; }
}
////MainWindow.xaml.cs
public partial class MainWindow : Window
{
public ObservableCollection<DataItem> DataList { get; set; }
public MainWindow()
{
DataList = new ObservableCollection<DataItem>(new DataItem[] {
new DataItem(){ Name = "1111", Path = "C:''1111", GroupProperties = new string[]{"HeNan", "JiangSu", "BeiJing"} },
new DataItem(){ Name = "2222", Path = "C:''2222", GroupProperties = new string[]{"HeNan", "TianJin", "ShenZhen"} },
new DataItem(){ Name = "3333", Path = "C:''1111", GroupProperties = new string[]{"GuangZhou", "XiAn", "BeiJing"} },
new DataItem(){ Name = "4444", Path = "C:''4444", GroupProperties = new string[]{"HeNan", "NanJing", "KunMing"} }
});
InitializeComponent();
}
}
////MainWindow.xaml
<Window x:Class="CultureDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<CollectionViewSource x:Key="ListBoxSource2" Source="{Binding DataList}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription Direction="Descending" PropertyName="Name">
</scm:SortDescription>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Path" StringComparison="OrdinalIgnoreCase"></PropertyGroupDescription>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<CollectionViewSource x:Key="ListBoxSource3" Source="{Binding DataList}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription Direction="Ascending" PropertyName="Name">
</scm:SortDescription>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="GroupProperties" StringComparison="OrdinalIgnoreCase"></PropertyGroupDescription>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="180*" />
<ColumnDefinition Width="169*" />
<ColumnDefinition Width="154*" />
</Grid.ColumnDefinitions>
<ListBox Name="listBox1" ItemsSource="{Binding DataList}" DisplayMemberPath="Name">
</ListBox>
<ListBox Grid.Column="1" Name="listBox2" ItemsSource="{Binding Source={StaticResource ListBoxSource2}}" >
<ListBox.GroupStyle>
<GroupStyle>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox Grid.Column="2" Name="listBox3" ItemsSource="{Binding Source={StaticResource ListBoxSource3}}">
<ListBox.GroupStyle>
<GroupStyle>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
CollectionViewSource
支持定义GroupDescriptions
,TreeView
也支持。请查看该链接。