Use CollectionViewSource to sort and group data in XAML.
<Window x:Class="WpfApplication1.Window1"
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"
xmlns:src="clr-namespace:WpfApplication1"
xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"
Title="CollectionViewSourceSample">
<Window.Resources>
<src:Places x:Key="places"/>
<CollectionViewSource Source="{StaticResource places}" x:Key="cvs">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="CityName"/>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<dat:PropertyGroupDescription PropertyName="State"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<DockPanel>
<ListBox ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="CityName" Name="lb">
<ListBox.GroupStyle>
<x:Static Member="GroupStyle.Default"/>
</ListBox.GroupStyle>
</ListBox>
</DockPanel>
</Window>
//File:Window.xaml.cs
using System.Windows;
using System.Collections.ObjectModel;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
public class Place
{
private string name;
private string state;
public string CityName
{
get { return name; }
set { name = value; }
}
public string State
{
get { return state; }
set { state = value; }
}
public Place()
{
this.name = "";
this.state = "";
}
public Place(string name, string state)
{
this.name = name;
this.state = state;
}
}
public class Places : ObservableCollection<Place>
{
public Places()
{
Add(new Place("A", "WA"));
Add(new Place("B", "WA"));
Add(new Place("C", "WA"));
}
}
}
Related examples in the same category