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.