Sort Data in Windows Phone using Collection View Source

When you write a Windows Phone application you will most likely consume data from a web service somewhere. If that service returns data to you in a sort order that you do not want, you have an easy alternative to sort the data without writing any C# or VB code. You use the built-in CollectionViewSource object in XAML to perform the sorting for you. This assumes that you can get the data into a collection that implements the IEnumerable or IList interfaces.

For this example, I will be using a simple Product class with two properties, and a list of Product objects using the Generic List class. Try this out by creating a Product class as shown in the following code:

public class Product
{
  public Product(int id, string name)
  {
    ProductId = id;
    ProductName = name;
  }

  public int ProductId { get; set; }
  public string ProductName { get; set; }
}

Create a collection class that initializes a property called DataCollection with some sample data as shown in the code below:

public class Products : List<Product>
{
  public Products()
  {
    InitCollection();
  }

  public List<Product> DataCollection { get; set; }

  List<Product> InitCollection()
  {
    DataCollection = new List<Product>();

    DataCollection.Add(new Product(3,
       "PDSA .NET Productivity Framework"));
    DataCollection.Add(new Product(1,
       "Haystack Code Generator for .NET"));
    DataCollection.Add(new Product(2,
       "Fundamentals of .NET eBook"));

    return DataCollection;
  }
}

Notice that the data added to the collection is not in any particular order. Create a Windows Phone page and add two XML namespaces to the Page.

xmlns:scm="clr-namespace:System.ComponentModel;assembly=System.Windows"
xmlns:local="clr-namespace:WPSortData"

The 'local' namespace is an alias to the name of the project that you created (in this case WPSortData). The 'scm' namespace references the System.Windows.dll and is needed for the SortDescription class that you will use for sorting the data. Create a phone:PhoneApplicationPage.Resources section in your Windows Phone page that looks like the following:

<phone:PhoneApplicationPage.Resources>
  <local:Products x:Key="products" />
  <CollectionViewSource x:Key="prodCollection"
      Source="{Binding Source={StaticResource products},
                       Path=DataCollection}">
    <CollectionViewSource.SortDescriptions>
      <scm:SortDescription PropertyName="ProductName"
                           Direction="Ascending" />
    </CollectionViewSource.SortDescriptions>
  </CollectionViewSource>
</phone:PhoneApplicationPage.Resources>

The first line of code in the resources section creates an instance of your Products class. The constructor of the Products class calls the InitCollection method which creates three Product objects and adds them to the DataCollection property of the Products class. Once the Products object is instantiated you now add a CollectionViewSource object in XAML using the Products object as the source of the data to this collection. A CollectionViewSource has a SortDescriptions collection that allows you to specify a set of SortDescription objects. Each object can set a PropertyName and a Direction property. As you see in the above code you set the PropertyName equal to the ProductName property of the Product object and tell it to sort in an Ascending direction.

All you have to do now is to create a ListBox control and set its ItemsSource property to the CollectionViewSource object. The ListBox displays the data in sorted order by ProductName and you did not have to write any LINQ queries or write other code to sort the data!

<ListBox
   ItemsSource="{Binding Source={StaticResource prodCollection}}"
   DisplayMemberPath="ProductName" />

Summary

In this blog post you learned that you can sort any data without having to change the source code of where the data comes from. Simply feed the data into a CollectionViewSource in XAML and set some sort descriptions in XAML and the rest is done for you! This comes in very handy when you are consuming data from a source where the data is given to you and you do not have control over the sorting.

NOTE: You can download this article and many samples like the one shown in this blog entry at my website. http://www.pdsa.com/downloads. Select “Tips and Tricks”, then “Sort Data in Windows Phone using Collection View Source” from the drop down list.

Good Luck with your Coding,
Paul Sheriff

** SPECIAL OFFER FOR MY BLOG READERS **
We frequently offer a FREE gift for readers of my blog. Visit http://www.pdsa.com/Event/Blog for your FREE gift!

Past Blog Content

Blog Archive

4 Comments

  • I have set my local namespace correctly but the collection I want to use is actually in my Data Context for the page. I get an error

    The tag 'Items' does not exist in XML namespace 'clr-namespace:Shopping_List'.

    How would I do this?

    Thanks.

  • Jeremy,

    I am sorry, but I don't understand what you mean here. Could you contact me at my email address psheriff@pdsa.com and that way you can send me a small sample of what is not working.

    Paul

  • Jeremy,

    I am sorry, but I think your email went to junk and got deleted automatically. Can you please resend it?

    Thanks,
    Paul

  • i want to know the same thing for the asynchronous calls in mvvm with inotifychange .

Comments have been disabled for this content.