W ostatnim poście pisałem o tym, że ListBox wspiera domyślnie sortowanie, grupowanie i filtrowanie danych. W tym wpisie, postaram się pokazać jak coś takiego możemy prosto osiągnąć. Przyjmijmy na potrzeby tego dema, że mamy prostą klasę:
public class MyItem
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public int Property3 { get; set; }
public override string ToString()
{
return string.Format(“{0}-{1}-{2}”, Property1, Property2, Property3);
}
}
Jak widać nic zaawansowanego ona nie ma. 3 właściwości i przeładowana metodą ToString. Utwórzmy teraz kolekcję, które będzie zawierać kilka elementów naszej nowej klasy:
var list = new List<MyItem>
{
new MyItem {Property1 = “1”, Property2 = “2”, Property3 = 1},
new MyItem {Property1 = “2”, Property2 = “3”, Property3 = 3},
new MyItem {Property1 = “3”, Property2 = “2”, Property3 = 2},
new MyItem {Property1 = “4”, Property2 = “3”, Property3 = 3},
new MyItem {Property1 = “5”, Property2 = “2”, Property3 = 2}
};
Teraz jeśli chcemy pogrupować wystarczy, że napiszemy:
ICollectionView view = CollectionViewSource.GetDefaultView(list);
view.GroupDescriptions.Clear();
view.GroupDescriptions.Add(new PropertyGroupDescription(“Property2”));
listBox.ItemsSource = view;
Elementy zostaną pogrupowane, w zależności od wyników zwracanych przez właściwość Property2. Jeśli jednak uruchomimy taki kod (oczywiście majać w XAML’u ListBox o nazwie listBox) nie zobaczymy naszego grupowania (choć elementy będą pogrupowane). Musimy troszkę naszego ListBox’a podrasować:
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text=”{Binding Path=Name}” />
DataTemplate>
GroupStyle.HeaderTemplate>
GroupStyle>
ListBox.GroupStyle>
Dzięki temu zdefiniujemy jak ma wyglądać nagłówek każdej grupy. W tym przypadku TextBox’a z wartością, która występuje w danej grupie.
Filtrowanie, również możemy w bardzo prosty sposób uzyskać poprzez ustawienie właściwości Filter:
view.Filter = i => ((MyItem) i).Property3 == 3;
Sortowanie też zatem skomplikowane nie będzie, wystarczy dodać definicję sortowania do kolekcji SortDescriptions np. tak:
view.SortDescriptions.Add(new SortDescription(“Property2”, ListSortDirection.Descending));
view.SortDescriptions.Add(new SortDescription(“Property3”, ListSortDirection.Ascending));
Miłej zabawy. W następnym odcinku powrócimy do kontrolek ItemsControls.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl