wpf icollectionview filter code example

Example: wpf icollectionview filter

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ListBox ItemsSource={Binding Customers} />
</Window>

public class CustomerView
{
   public CustomerView()
   {
        DataContext = new CustomerViewModel();
   }
}
 
public class CustomerViewModel
{
    private ICollectionView _customerView;
 
    public ICollectionView Customers
    {
        get { return _customerView; }
    }
 
    public CustomerViewModel()
    {
        IList<Customer> customers = GetCustomers();
        _customerView = CollectionViewSource.GetDefaultView(customers);
    }
}
//The collection view adds support for selection tracking. 
//If you set the property IsSynchronizedWithCurrentItem to True 
//on the view that the collection is bound to, 
//it automatically synchronizes the current item of the CollectionView 
//and the View.
<ListBox ItemsSource="{Binding Customers}" IsSynchronizedWithCurrentItem="True" />

ICollectionView _customerView = CollectionViewSource.GetDefaultView(customers);
_customerView.Filter = CustomerFilter
 
 // filter
private bool CustomerFilter(object item)
{
    Customer customer = item as Customer;
    if(customer != null)
    	return customer.Name.Contains( _filterString );
    return false;
}

//If you change the filter criteria and you want to refresh the view, 
//you have to call Refresh() on the collection view
public string FilterString
{
  get { return _filterString; }
  set 
  { 
      _filterString = value; 
      NotifyPropertyChanged("FilterString");
      _customerView.Refresh();
  }
}

//Sorting data ascending or descending by one or multiple criterias 
//is a common requirement for viewing data. The collection view makes 
//it so easy to achieve this goal. Just add as many SortDescriptions 
//as you like to the CollectionView
ICollectionView _customerView = CollectionViewSource.GetDefaultView(customers);
_customerView.SortDescriptions.Add( 
                new SortDescription("LastName", ListSortDirection.Ascending );
_customerView.SortDescriptions.Add( 
                new SortDescription("FirstName", ListSortDirection.Ascending );

//The sorting technique explained above is really simple, but also quite 
//slow for a large amount of data, because it internally uses reflection. 
//But there is an alternative, more performant way to do sorting by 
//providing a custom sorter.

ListCollectionView _customerView = CollectionViewSource.GetDefaultView(customers);
                                         as ListCollectionView;
_customerView.CustomSort = new CustomerSorter(); 
 
public class CustomerSorter : IComparer
{
    public int Compare(object x, object y)
    {
        Customer custX = x as Customer;
        Customer custY = y as Customer;
        return custX.Name.CompareTo(custY.Name);
    }
}