XAML.cz Magazín moderních technologií založených na XAML

Novinky ve WPF 4 – DataGrid

Napsáno pro WPF od Jarda Jirava  [24.08.2010]

V dnešním pokračování o novinkách ve WPF 4 se podívám na nové zobrazovací prvky, které můžete použít ve svých WPF aplikacích. Jedná se o prvky, které byly dříve k dispozici v kontribučních balíčcích a které se staly součástí .NET frameworku.

DataGrid

Jako první zmíním DataGrid, který umožňuje zobrazení dat do sloupců a řádků, tak jak to znáte třeba z tabulky Excelu. DataGrid se však přeci jen od tabulky v Excelu liší a to tím, že je určen pro navázání seznamu objektů, kde každý jednotlivý objekt dokáže zobrazit v řádku, tuto kolekci – implementující IEnumerable - pak na DataGrid navážeme prostřednictvím vlastnosti ItemsSource. Pokud bychom chtěli nejen upravovat data v DataGridu, ale také je přidávat či odebírat, pak by naše kolekce měla ještě implementovat rozhraní INotifyCollectionChanged a samozřejmě, pokud chceme, aby se změny propagovaly do objektů, je třeba, aby daný objekt implementoval rozhraní INotifyPropertyChanged.

Typy sloupců

V klasické tabulce jsme povětšinou zvyklí mít jen textové hodnoty, ale v okamžiku, kdy chceme přidat nějakou interaktivitu, nebo umožňit uživateli editovat data přímo v DataGridu hodí se nám ještě další typy sloupců, které můžeme nabídnout. Přímo vestavěných typů sloupečků má DataGrid hned několik a jsou to:

  • DataGridTextColumn – který použijeme v okamžiku, kdy budeme chtít zobrazovat nějakou string hodnotu
  • DataGridCheckBoxColumn – se nám bude hodit v případech, kdy má náš objekt bool vlastnost, kterou chceme upravovat
  • DataGridComboBoxColumn – je využitelný v případech, kdy máme nějaký výčet (Enum) a uživatel má vybrat jednu z jeho hodnot
  • DataGridHyperlinkColumn – nám pak umožní zobrazit a zpřístupnit Uri adresu, která bude aktivní

Tyto všechny sloupečky můžeme použít jak deklarativně, tak také budou použity na příslušné vlastnosti v případě, kdy nastavíme vlastnost AutoGeneratingColumn na hodnotu true. Poté dojde k automatickému vygenerování odpovídajících sloupců v DataGridu.

Jestliže jste si nevybrali ani jeden z nabízených sloupečků, tak potom je možné použít ještě jeden typ – ten však jen v případě, že hodnota vlastnosti AutoGeneratingColumn je nastavena na false – a tím je sloupec DataGridTemplateColumn. Tento typ sloupce umožňuje nastavit šablonu pro prohlížení CellTemplate i pro editaci CellEditingTemplate a dovolí nám tak nastavit si jakýkoliv vlastní typ zobrazení pro danou vlastnost objektu. Může se třeba jednat o DatePicker nebo náš vlastní prvek.

Pokud máme deklarovány, nebo jsme si nechali nagenerovat jednotlivé sloupce, můžeme přistoupit k jednotlivým řádkům nebo buňkám DataGridu.

Výběr

To jakým způsobem bude možné vybrat řádky nám dovolí nastavit vlastnost SelectionMode, která určuje, zda bude možné provést jen jednotlivý nebo rozšířený výběr. Pokud chceme umožnit uživateli ještě jiný výběr a to způsobem, zda mu umožníme vybrat jen celý řádek, nebo jen buňku pak nastavíme pomocí vlastnosti SelectionUnit. Když už budeme mít vybranou nějakou oblast nebo jen jednu buňku, budeme s ní chtít něco provádět, tuto vybranou oblast nám zpřístupní vlastnost SelectedCells. Samozřejmě nesmím zapomenout ani na dvě pomocné metody pro výběr, jsou jimi vlastnost SelectAllCells a UnselectAllCells, které umožní programově vybrat nebo naopak odznačit všechny buňky.

Samozřejmě by bylo pěkné, pokud by DataGrid uměl něco víc než jen zobrazit tabulku hodnot a uživatel si tak mohl třeba seřadit data podle některého sloupce.

Řazení, filtrování a grupování

Právě k těmto účelům můžeme využít dalších schopností DataGridu. Řazení je asi všem dobře známo a taktéž i uživatelům, kdy kliknutím na záhlaví sloupce dojde k seřazení hodnot dle tohoto sloupce. Tuto funkcionalitu poskytuje i DataGrid a stejně tak nám umožní i data filtrovat dle zadané podmínky nebo data seskupit podle nějakého kriteria. To vše je možné v okamžiku, kdy jako ItemsSource pro DataGrid přiřadíme kolekci implementující rozhraní ICollectionView. Zároveň určitě budeme chtít, aby jednotlivé hlavičky seskupených oblastí měly nějaký pěkný vzhled, který se bude odlišovat od zbytku tabulky, to můžeme zajistit tak, že přiřadíme styl do kolekce GroupStyle, pro každé seskupení tak můžeme definovat odlišný vzhled.

Jak může taková tabulka vypadat si předvedeme v některém z příštích článků. Dříve než se tak stane však přiblížíme jednu důležitou věc a to je editace uvnitř DataGridu.

Editace objektů

Ač se mi osobně editace uvnitř mřížky jeví jako nepraktická a méně přehledná, jsou případy, kdy se nám takové chování může hodit a s radostí jej přivítáme. DataGrid nám i v této chvíli vychází vstříc a pokud mu navíc maličko pomůžeme, dosáhneme kýženého efektu. K tomu, abychom mohli editovat data nepotřebujeme téměř nic, stačí nám jednoduchý objekt, jestliže však chceme přeci jen nějaký komfort, tak nám DataGrid pomůže neboť dokáže pracovat s rozhraním IEditableObject a vyvolává na objektu s tímto interface příslušné metody BeginEdit, CommitEdit, a CancelEdit. Začátek editace je ve výchozím stavu namapován na klávesu F2, ukončení a potvzrení změn je pak namapováno na stisk klávesy ENTER, případně je vyvoláno v okamžiku přechodu na jiný řádek. Pokud by chtěl uživatel zrušit změny a náš objekt je na to připraven, může tak učinit stiskem klávesy ESC.

Nejspíše se dostanete do situace, kdy nebudete chtít povolit uživateli jakoukoliv editaci, pak se vám bude hodit nastavit vlastnost IsReadOnly na hodnotu true. Pokud naopak budete chtít nabídnout uživateli více než jen editaci současných záznamů, máte možnost si pohrát s nastavením vlastnosti CanUserAddRows a CanUserDeleteRows, které zpřístupní možnosti přidat nebo naopak odebrat řádky.

S editací objektů je pak spojena ještě důležitá činnost a to způsob, jak zvalidovat vstupní data.

Validace objektů

I s tímto si DataGrid umí poradit a nabízí nám vývojářům prostředky, jak dát uživateli najevo, že hodnoty vložené do příslušných buňek nejsou v pořádku. Validace pak může probíhat jak na úrovni samotné buňky, tak i na úrovni celého řádku – objektu – když uživatel potvrdí vložené hodnoty. Pokud se nespokojíme s výchozí indikací, můžeme využít vlastnosti RowValidationErrorTemplate a změnit vzhled chybové zprávy.

Jestliže chceme přidat navíc ještě nějaká validační pravidla, můžeme tak učinit pomocí podědění od třídy ValidationRule a přepsání metody Validate. Takovouto třídu pak vložíme do kolekce RowValidationRules a můžeme se těšit z možnosti validace objektu hned na vstupu, který by měl být prvotní validací nikoliv však konečnou.

Závěrem

V předchozích odstavcích jsem se snažil alespoň v krátkosti popsat a naznačit jednotlivé možnosti, které nám nabízí prvek DataGrid pro zobrazování a manipulaci s daty. Jedná se o poměrně komplexní prvek, který si jistě zaslouží bližší pozornosti a tak se s ním zde jistě ještě setkáte. Příště si představíme dva velice podobné prvky, které nabízejí práci s datumy.

Komentáře

ukládám komentář, vyčkejte prosím..
  1. Buďte první, kdo napíše komentář.

@xamlcz

  • RT @jvanrhyn: XAML, It's a bit like olives. Takes a while to get used to. But once you're used to it. It is actually pretty good. <3 XAML
  • RT @moser_christian: WPF Inspector 0.9.7 is released. It supports .NET 3.5 and 4.0 The project is now open source and available on CodeP ...
  • Jeff Handley oznámil vydání WCF RIA Services v.1.0 SP1 RTM http://bit.ly/gOgckn ke stažení na http://bit.ly/gVAXdK
  • jedna výzva pro Brno. Byl někdo z vás na přednášce o RIA v MS Akvárku? Dejte o sobě vědět. Děkuji
  • také jste uvažovali o tom, že zkusíte na projekt použít Caliburn Micro nebo naopak Prism 4? A co tak obojí, šlo by to nebo ne? Již brzy