tags:

views:

137

answers:

1

Here is my xaml that tells the collectionviewsource sort property name.

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

The xaml above works fine but problem I have is that I don't know how to give a variable value to SortDescription PropertyName. I have a property in my viewmodel that tells which property to sort on but I am not able to bind this property to SortDescription's PropertyName field.

Is there any way?

A: 

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; }
    }
}
Wallstreet Programmer