Binding PropertyName to CollectionSource SortDescription in Xaml

Here is my xaml that reports the name of the sortviewsource sort property.

<CollectionViewSource Source="{Binding Contacts}" x:Key="contactsCollection" Filter="CollectionViewSource_Filter"> <CollectionViewSource.SortDescriptions> <scm:SortDescription PropertyName="DisplayName" /> </CollectionViewSource.SortDescriptions> </CollectionViewSource> 

xaml above works fine, but the problem is that I don't know how to pass the value of the SortDescription PropertyName variable. I have a property in my view model that tells which property to sort, but I cannot associate this property with the SortDescription PropertyName field.

Is there any way?

+6
wpf xaml
source share
1 answer

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; } } } 
+7
source share

All Articles