You can set the sort description in code behind.
XAML:
<Window.Resources>
<CollectionViewSource Source="{Binding People}" x:Key="_peopleCVS" />
</Window.Resources>
<StackPanel>
<ListBox
ItemsSource="{Binding Source={StaticResource _peopleCVS}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" Margin="5,0"/>
<TextBlock Text="{Binding Path=Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ComboBox SelectionChanged="ComboBox_SelectionChanged">
<ComboBoxItem>Age</ComboBoxItem>
<ComboBoxItem>Name</ComboBoxItem>
</ComboBox>
</StackPanel>
Code behind:
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
namespace CollectionViewSourceDemo
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
People = new List<Person>();
People.Add(new Person("Bob", 34));
People.Add(new Person("Sally", 12));
People.Add(new Person("Joe", 56));
People.Add(new Person("Mary", 23));
DataContext = this;
}
public List<Person> People { get; private set; }
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBoxItem comboBoxItem = (sender as Selector).SelectedItem as ComboBoxItem;
string sortProperty = comboBoxItem.Content as string;
CollectionViewSource cvs = FindResource("_peopleCVS") as CollectionViewSource;
cvs.SortDescriptions.Clear();
cvs.SortDescriptions.Add(new SortDescription(sortProperty, ListSortDirection.Ascending));
}
}
public class Person
{
public Person(string name, int age)
{
Name = name;
Age = age;
}
public string Name { get; private set; }
public int Age { get; private set; }
}
}