{"id":65,"date":"2011-11-28T20:13:00","date_gmt":"2011-11-28T20:13:00","guid":{"rendered":"http:\/\/tpodolak.com.hostingasp.pl\/blog\/2011\/11\/28\/kolekcje-wspierajace-sortowanie-grupowanie-oraz-filtrowanie\/"},"modified":"2016-01-31T00:36:02","modified_gmt":"2016-01-31T00:36:02","slug":"kolekcje-wspierajace-sortowanie-grupowanie-oraz-filtrowanie","status":"publish","type":"post","link":"https:\/\/tpodolak.com\/blog\/2011\/11\/28\/kolekcje-wspierajace-sortowanie-grupowanie-oraz-filtrowanie\/","title":{"rendered":"Kolekcje wspieraj\u0105ce sortowanie, grupowanie oraz filtrowanie"},"content":{"rendered":"<h3>1. ListViewCollection (WPF)<\/h3>\n<p>ListViewCollection jest to kolekcja wprowadzona do WPF-a, kt\u00f3ra wspiera sortowanie, grupowanie oraz filtrowanie. Kolekcj\u0119 tak\u0105 tworzymy w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\nList<Player> palyerList = new Player { new Player(),new Player()};\r\npublic ListViewCollection<Player> PlayerListCollectionView {get;set;}\r\nListViewCollection<Player> PlayerListCollectionView= new ListViewCollection<Player>(playerList);\r\n<\/pre>\n<p>czyli po prostu w konstruktorze przesy\u0142amy obiekt implementuj\u0105cy interfejs <span style=\"font-style: italic;\">IEnumerable<\/span><br \/>\n<b><span style=\"font-family: Verdana,sans-serif; font-size: big;\">Filtrowanie<\/span><\/b><br \/>\nW celu przefiltrowania kolekcji wystarczy poda\u0107 odpowiedni obiekt typu Predicate<object>(czyli tak naprawd\u0119 wystarczy napisa\u0107 funkcj\u0119 zwracaj\u0105c\u0105 bool oraz przyjmuj\u0105c\u0105 w parametrze obiekt). Za\u0142\u00f3\u017cmy, \u017ce chcemy pokaza\u0107 na widoku jedynie tych graczy, kt\u00f3ry nazywaj\u0105 si\u0119 &#8220;Tomek&#8221;. W tym celu wystarczy, \u017ce zrobimy co\u015b takiego:<\/p>\n<pre lang=\"csharp\">\r\nPlayerListCollectionView.Filter = val => { return (val as Player).Name.ToLower() == \u201ctomek\u201d;  }\r\n<\/pre>\n<p>po zaaplikowaniu predicata widok zbindowany do danej listy automatycznie si\u0119 od\u015bwie\u017cy. W razie czego mo\u017cna zawsze wymusi\u0107 o\u015bwie\u017cenie przez wywo\u0142anie funkcji<\/p>\n<pre lang=\"csharp\">\r\nPlayerListCollectionView.Refresh();\r\n<\/pre>\n<p><b><span style=\"font-family: Verdana,sans-serif; font-size: big;\">Grupowanie<\/span><\/b><br \/>\nKolekcja <span style=\"font-style: italic;\">ListViewCollection<\/span> wspiera r\u00f3wnie\u017c grupowanie. W celu pogrupowania listy po jakim\u015b elemencie wystarczy do naszej listy dorzuci\u0107 tzw. group description. Odbywa si\u0119 to w taki spos\u00f3b:<\/p>\n<pre lang=\"csharp\">\r\nPlayerListCollectionView.GroupDescriptions.Add(new PropertyGroupDescription { PropertyName = \"Name\" }\r\n<\/pre>\n<p>Po dodaniu <span style=\"font-style: italic;\">PropertyGroupDescription<\/span> widok automatycznie pogrupuje nam elementy po danych w\u0142a\u015bciwo\u015bciach.<br \/>\n<b><span style=\"font-family: Verdana,sans-serif; font-size: big;\">Sortowanie<\/span><\/b><br \/>\nNasza kolekcja wspiera r\u00f3wnie\u017c sortowanie. W celu posortowania wystarczy stworzy\u0107 obiekt implementuj\u0105cy interfjes <span style=\"font-style: italic;\">IComparer<\/span>, a nast\u0119pnie przypisa\u0107 go do w\u0142a\u015bciwo\u015bci <span style=\"font-style: italic;\">CustomSort<\/span><\/p>\n<pre lang=\"csharp\">\r\npublic class PlayerComparer : IComparer\r\n{\r\n    public int Compare(object x, object y)\r\n    {\r\n        if (((Player)x).Age > (((Player)y).Age))\r\n        {\r\n            return 1;\r\n        }\r\n        return -1;\r\n    }\r\n}\r\n\r\nPlayerListCollectionView.CustomSort = new PlayerComparer ()\r\n<\/pre>\n<p>po takiej akcji widok automatycznie si\u0119 od\u015bwie\u017cy i poka\u017ce posortowane dane.<\/p>\n<h3>2. PagedCollectionView (Silverlight)<\/h3>\n<p><span style=\"font-style: italic;\">PagedCollectionView <\/span>jest to ubo\u017csza wersja <span style=\"font-style: italic;\">ListCollectionView <\/span>z WPF-a. Grupowanie oraz filtrowanie dobywa si\u0119 w ten sam spos\u00f3b, jednak\u017ce sortowanie zosta\u0142o w znaczny spos\u00f3b utrudnione. Sortowa\u0107 mo\u017cemy jedynie po w\u0142a\u015bciwo\u015bciach, nie mo\u017cemy stworzy\u0107 w\u0142asnego <span style=\"font-style: italic;\">comparera<\/span>, kt\u00f3ry zosta\u0142by u\u017cyty do wykonania operacji sortowania. Wykonanie operacji mo\u017ce wygl\u0105da\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre lang=\"csharp\">\r\nPlayerPagedCollection.SortDescriptions.Clear();\r\nPlayerPagedCollection.SortDescriptions.Add(new System.ComponentModel.SortDescription(\"Name\", ListSortDirection.Ascending));\r\n<\/pre>\n<p>W tym wypadku nasza kolekcja zostanie posortowana po w\u0142a\u015bciwo\u015bci &#8220;Name&#8221;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. ListViewCollection (WPF) ListViewCollection jest to kolekcja wprowadzona do WPF-a, kt\u00f3ra wspiera sortowanie, grupowanie oraz filtrowanie. Kolekcj\u0119 tak\u0105 tworzymy w nast\u0119puj\u0105cy spos\u00f3b List palyerList = new Player { new Player(),new Player()}; public ListViewCollection PlayerListCollectionView {get;set;} ListViewCollection PlayerListCollectionView= new ListViewCollection(playerList); czyli po prostu w konstruktorze przesy\u0142amy obiekt implementuj\u0105cy interfejs IEnumerable Filtrowanie W celu przefiltrowania kolekcji wystarczy [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[139,140,45],"tags":[266,267,191],"class_list":["post-65","post","type-post","status-publish","format-standard","hentry","category-listcollectionview","category-pagedcollectionview","category-wpf","tag-listcollectionview","tag-pagedcollectionview","tag-wpf"],"_links":{"self":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":4,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/65\/revisions"}],"predecessor-version":[{"id":569,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/65\/revisions\/569"}],"wp:attachment":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/categories?post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/tags?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}