Utilizzando l'oggetto CollectionView e la proprietà GroupDescriptions è possibile suddividere in gruppi l'insieme di elementi di cui la CollectionView è la vista.
GroupDescriptions consente di definire la proprietà che verrà usata come termine di raggruppamento, ma se volessimo raggruppare secondo un criterio proprietario?
In questo caso dobbiamo creare la CollectionView usando l'oggetto CollectionViewSource (il quale ritornerà, in base al tipo di insieme associato una CollectionView o una ListCollectionView a seconda se l'insieme passatogli implementa ICollection oppure no) associandogli un custom Converter.
Supponiamo di avere una ObservableCollection<Product> (products), che Product abbia una proprietà Price e di volere raggruppare i prodotti tra quelli che hanno prezzo >100 e tutti gli altri.
CollectionViewSource cvs = new CollectionViewSource();
cvs.Source = products;
PropertyGroupDescription pgd = new PropertyGroupDescription();
pgd.Converter = new MyConverter();
cvs.GroupDescriptions.Add(pgd);
ICollectionView groupedView = cvs.View;
Dove MyConverter è una classe che implementa IValueConverter
public class MyConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
Product p = value as Product;
return (p.Price > 100) ? "Expensive" : "Cheap"
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException("The method or operation is not implemented.");
}
}
Risultato: una vista che contiene 2 gruppi creati secondo il nostro specifico criterio.