Menü 2 für Experten: Das Filtern von Daten
Der Windows-Explorer macht es mit der Suchfunktion vor. Der Inhalt des Explorers zeigt nur die Daten an, die dem Wert im Suchfeld entsprechen. Genau eine solche Filterfunktion ohne stetigen Request zum Server bietet die CollectionSourceView. Die entsprechende Collection mit Daten wird der Property Source vom CollectionSourceView überreicht. Anschließend vergibt man mit einem SortDescription-Objekt eine Regel, welche Property vom Entity für die Sortierung berücksichtigt werden soll. Zudem kann man wie unter LINQ die Sortierlogik auswählen. Für eine Sortierreihenfolge vom größten bis zum kleinsten Wert dient Ascending. Für eine umgekehrte Reihenfolge wird Descending verwendet.
Ist durch einen Wert auf der Oberfläche ein Keyword gesetzt, muss von der CollectionSourceView ein Filter-Event abonniert werden. Dieses wird anschließend sofort ausgeführt. In der dazu ausgeführten Methode werden alle weiteren Informationen durch die FilterEventArgs überreicht. Bei dem mitgelieferten Parameter wird eine Accepted-Property bereitgestellt. Dieser wird entweder der zu filternde Wert übergeben oder mittels True alles zurückgesetzt (Listings 2 und 3).
Listing 2: ViewModel mit CollectionSourceView
public class ProductsViewModel { public List- Products { get; set; } public CollectionViewSource SortedList { get; set; } private string _searchword; public string Searchword { get { return _searchword; } set { _searchword = value; SortedList.Filter += SortedList_Filter; } } public ProductsViewModel() { Products = new SampleDataSource().Collection.ToList(); SortedList = new CollectionViewSource(); SortedList.Source = Products; SortedList.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); } private void SortedList_Filter(object sender, FilterEventArgs e) { Item item = e.Item as Item; if (item != null) { if (Searchword == string.Empty) { e.Accepted = true; } else { e.Accepted = item.Name.StartsWith(Searchword); } } } }
Listing 3: XAML-Deklaration mit einem Binding zur CollectionSourceView