You can set the sort description in the 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; } } }
Wallstreet programmer
source share