Apply Custom Grouping to a Collection
<Window
x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="WPF" Height="300" Width="160">
<Window.Resources>
<WpfApplication1:Countries x:Key="countries"/>
<WpfApplication1:GroupByContinentConverter x:Key="GroupByContinentConverter"/>
<CollectionViewSource
x:Key="cvs"
Source="{Binding Source={StaticResource countries}}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription Converter="{StaticResource GroupByContinentConverter}" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<ItemsControl ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="Name" >
<ItemsControl.GroupStyle>
<x:Static Member="GroupStyle.Default"/>
</ItemsControl.GroupStyle>
</ItemsControl>
</Grid>
</Window>
//File:Window.xaml.cs
using System;
using System.Globalization;
using System.Windows.Data;
using System.Collections.ObjectModel;
namespace WpfApplication1
{
public class GroupByContinentConverter : IValueConverter
{
public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
{
Country country = (Country)value;
// Decide which group the country belongs in
switch (country.Continent)
{
case Continent.NorthAmerica:
return "Americas";
default:
return "Others";
}
}
public object ConvertBack(object value,Type targetType,object parameter,CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class Country
{
private string name;
private Continent continent;
public Country(string name, Continent continent)
{
this.name = name;
this.continent = continent;
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public Continent Continent
{
get
{
return continent;
}
set
{
continent = value;
}
}
}
public enum Continent
{
Europe,
NorthAmerica,
}
public class Countries : Collection<Country>
{
public Countries()
{
this.Add(new Country("Great Britan", Continent.Europe));
this.Add(new Country("USA", Continent.NorthAmerica));
this.Add(new Country("Canada", Continent.NorthAmerica));
}
}
}
Related examples in the same category