Datové vazby (1) Datová vazba (data binding) je proces, který ustanovuje spojení mezi uživatelským rozhra-ním aplikace a její aplikační logikou Poskytuje aplikacím možnost prezentovat data a pracovat s nimi Dovoluje, aby elementy uživatelského rozhra-ní byly navázány na data z rozličných dato-vých zdrojů V okamžiku, kdy dojde ke změně dat v dato-vém zdroji, jsou tyto změny automaticky re-flektovány na úrovni uživatelského rozhraní 25/05/2018
Datové vazby (2) Datové vazby mohou také zabezpečit, že změ-na na úrovni uživatelského rozhraní se promít-ne do navázaného datového zdroje Datová vazba vytváří most mezi cílem a zdro-jem vazby Cíl vazby (Binding target) Zdroj vazby (Binding source) Binding object DependencyObject Object Závislá vlastnost Vlastnost 25/05/2018
Datové vazby (3) Datová vazba se skládá ze čtyř komponent: cíl vazby (binding target): prvek uživatelského rozhraní, např. TextBox cílová vlastnost (target property): musí se jednat o závislou vlastnost v objektu cíl vazby např. vlastnost Text v objektu třídy TextBox zdroj vazby (binding source): uživatelem definovaný objekt, prvek uživatelského rozhraní, uzel v dokumentu XML apod. např. objekt třídy Osoba cesta k hodnotě ve zdroji vazby: vlastnost v objektu představujícím zdroj vazby např. Jmeno v objektu třídy Osoba 25/05/2018
Datové vazby (4) Vytvoření datové vazby se provádí pomocí objektu třídy Binding (zapisováno jako markup rozšíření, tj. ve složených závorkách) Datové vazby umožňují tři směry toku dat Cíl vazby (Binding target) Zdroj vazby (Binding source) Binding object DependencyObject Object Závislá vlastnost OneWay Vlastnost TwoWay OneWayToSource 25/05/2018
Datové vazby (5) Zvolený směr určuje hodnota vlastnosti Mode: OneWay: změny vlastnosti zdroje implikují automatické změny v cílové vlastnosti změny cílové vlastnosti neovlivňují vlastnost zdroje TwoWay: změny vlastnosti zdroje provádí automatické změny v cílové vlastnosti a naopak změny cílové vlastnosti modifikují vlastnost zdroje OneWayToSource: opak vazby OneWay provádí změny vlastnosti zdroje na základě změn cílo-vé vlastnosti 25/05/2018
Datové vazby (6) Poznámka: datová vazba může být nastavena i v režimu OneTime: vlastnost zdroje inicializuje cílovou vlastnost, ale další změny vlastnosti zdroje už nemají na cílovou vlastnost vliv Aby bylo možné detekovat změny zdroje (při použití směru OneWay a TwoWay), je zapo-třebí zabezpečit mechanismus pro oznámení o změně hodnoty Toto lze realizovat implementováním rozhraní INotifyPropertyChanged, jež předepi-suje událost PropertyChanged 25/05/2018
Datové vazby (7) V případě použití směru vazby TwoWay nebo OneWayToSource jsou sledovány změny cílové vlastnosti, které poté modifikují zdroj vazby Událost, která spustí modifikaci zdroje, je dána vlastností UpdateSourceTrigger (třídy Binding): PropertyChanged: k modifikaci na úrovni zdroje dochází okamžitě kdyko-liv cílová vlastnost změní svou hodnotu LostFocus: modifikace zdroje se uskuteční v době, kdy cílový ovlá-dací prvek ztrácí vstupní zaměření (focus) 25/05/2018
Datové vazby (8) Explicit: modifikace se provede explicitně zavoláním metody UpdateSource Pro implementaci datové vazby je zapotřebí specifikovat tzv. zdroj datové vazby (binding source) Zdroj datové vazby může být nastaven pomocí vlastnosti: DataContext: definována jako závislá vlastnost na úrovni třídy FrameworkElement její hodnota je děděna elementy, které jsou popsány ve stromě elementů na nižších úrovních 25/05/2018
Datové vazby (9) Source: ElementName: RelativeSource: vhodné zejména v případě, kdy je zapotřebí navázat více vlastností na jeden zdroj Source: vlastnost definovaná ve třídě Binding umožňuje nastavení zdroje přímo v deklaraci vazby ElementName: vlastnost třídy Binding dovoluje provázání vlastností dvou elementů (ovláda-cích prvků) RelativeSource: používáno pro realizaci vazby specifikované v šabloně ovládacího prvku nebo ve stylu 25/05/2018
Datové vazby (10) Pro zadání cesty k hodnotě ve zdroji vazby se používá vlastnost Path (třídy Binding) V případě, že se provádí vazba celého objektu, je možné specifikaci pomocí Path vynechat Je-li je zapotřebí v průběhu datové vazby pro-vést modifikaci (konverzi) hodnoty poskytova-né zdrojem vazby, je možné definovat třídu (tzv. konvertor), která implementuje rozhraní IValueConverter 25/05/2018
Datové vazby (11) Rozhraní IValueConverter definuje sig-natury dvou abstraktních metod: Convert ConvertBack Definovaný konvertor se zadává pomocí nasta-vení hodnoty vlastnosti Converter třídy Binding Prostřednictvím datových vazeb lze pracovat také s kolekcemi (např. nastavení prvku typu ListBox, ListView, TreeView apod. tak, aby zobrazoval prvky kolekce) 25/05/2018
Datové vazby (12) Definice zdroje dat (kolekce) se provádí nasta-vením hodnoty vlastnosti ItemsSource třídy ItemsControl Mají-li se změny v kolekci automaticky proje-vit i v příslušném ovládacím prvku, je nezbyt-né, aby kolekce implementovala rozhraní INotifyCollectionChanged předepi-sující událost CollectionChanged Poznámka: WPF poskytuje (definuje) generickou kolekci ObservableCollection<T>, která zmíněné rozhraní implementuje 25/05/2018
Datové vazby (13) Po nastavení kolekce, jako zdroje dat, lze apli-kovat tzv. pohledy (views): třídy implementující ICollectionView umožňují např. řazení, filtrování, seskupování dat beze změny kolekce 25/05/2018
Šablony (1) Šablony (templates) popisují celkový vzhled (vizuální zobrazení) ovládacího prvku nebo kolekce dat Každý ovládací prvek má svoji implicitní šab-lonu, která popisuje jeho celkový vzhled WPF umožňuje vytvářet vlastní šablony, které vzhled ovládacího prvku změní (přizpůsobí) Šablona zpřístupňuje možnost definovat vzhled prvku na úrovni vnitřní kompozice: definujeme, z čeho je ovládací prvek sestaven a jak jsou jednotlivé jeho části vůči sobě rozloženy 25/05/2018
Šablony (2) Propojení mezi šablonou a aplikační logikou je realizováno pomocí datových vazeb WPF rozlišuje dva typy šablon: šablona ovládacího prvku (control template): popisuje vzhled na úrovni ovládacího prvku (např. Button, CheckBox apod.) datová šablona (data template): popisuje vzhled a strukturu kolekce dat poskytuje možnost formátovat a definovat prezentaci dat na úrovni libovolného prvku uživatelského rozhraní nejčastěji používána u dat v prvcích typu (ListBox, ComboBox, ListView apod.) 25/05/2018
Šablony ovládacích prvků (1) Šablona ovládacího prvku je dána jeho vlast-ností Template typu ControlTemplate Obvykle definovány pomocí logický zdrojů Využitím elementu <ControlTemplate> je možné popsat instanci třídy, která se násled-ně přiřadí do vlastnosti Template V elementu <ControlTemplate>: je nutné atributem TargetType specifikovat třídu, na kterou bude moci být šablona aplikována lze využít element <ContentPresenter> vyjadřující zobrazení obsahu ovládacího prvku 25/05/2018
Šablony ovládacích prvků (2) Navázání prvků šablony na vlastnosti třídy se provádí pomocí TemplateBinding: nutné použít v okamžiku, kdy prvek šablony je jiný než odpovídající vlastnost třídy Třída ControlTemplate mimo jiné nabízí vlastnost Triggers dovolující definovat spouště Poznámka: šablonu lze definovat i v rámci stylu pomocí elementu <Setter> a atributů Property a Value 25/05/2018
Datové šablony (1) Dovolují modifikovat způsob vizuálního zo-brazení datových objektů Datové šablony se definují pomocí elementu <DataTemplate> Specifikace typu datového objektu, k němuž se šablona vztahuje, se provádí prostřednictvím atributu DataType Vytvořená šablona se přiřazuje do vlastnosti ItemTemplate, která je definována ve třídě ItemsControl 25/05/2018
Datové šablony (2) Navázání prvků šablony na vlastnosti třídy specifikující datový zdroj se realizuje pomocí rozšíření Binding Poznámky: datový zdroj (kolekce) je nastaven prostřednictvím vlastnosti ItemsSource pomocí datových spouští lze docílit různého vzhle-du prezentovaných dat v závislosti na hodnotách jejich vlastností 25/05/2018
Ověřování platnosti (1) Pro ověřování platnosti (validaci) údajů (hod-not) zadaných uživatelem poskytuje WPF: abstraktní třídu ValidationRule specifikuje tzv. validační pravidlo statickou třídu Validation třídu ValidationResult Na úrovni potomka třídy ValidationRule je zapotřebí předefinovat metodu Validate tak, aby vracela validní, resp. nevalidní instan-ci třídy ValidationResult (v závislosti na tom, zda testovaná hodnota je, resp. není vyhovující stanoveným podmínkám) 25/05/2018
Ověřování platnosti (2) Odpovídající instance lze vrátit pomocí: ValidationResult.ValidResult: zpřístupnění vlastnosti ValidResult, která vrací validní instanci třídy ValidationResult ValidationResult(false, ”Popis chyby”): vrací nevalidní instanci třídy ValidationResult společně s textovým popisem vzniklé chyby Testovaná hodnota se metodě Validate pře-dává pomocí parametru value typu object Hodnota parametru value je dána nastave-ním datové vazby, v níž cílová vlastnost repre-zentuje hodnotu, kterou je zapotřebí otestovat 25/05/2018
Ověřování platnosti (3) Propojení s třídou obsahující definici metody Validate (potomek ValidationRule) se realizuje prostřednictvím nastavení vlastno-sti ValidationRules třídy Binding Poznámky: vlastnost ValidationRules je definována jako kolekce validačních pravidel třída ValidationRule poskytuje také vlastnost ValidatesOnTargetUpdated dovolující provést validační pravidlo v okamžiku, kdy je cíl vazby aktualizován 25/05/2018
Ověřování platnosti (4) Za účelem poskytnutí zpětné vazby uživateli (při zadání chybné hodnoty) je možné využít statickou třídu Validation: definuje přidružené vlastnosti: ErrorTemplate: dovoluje nastavit šablonu ovládacího prvku tak, aby indikoval zadání chybné hodnoty pomocí tzv. vrstvy adorner (součást vi--zuálního stromu) HasError: vrací hodnotu, zda při validaci byla zjištěna chyba Errors: kolekce zjištěných chyb v průběhu validace každá chyba je v kolekci reprezentována jako instance třídy ValidationError a pomocí vlastnosti ErrorContent o ní lze zjistit bližší informace 25/05/2018
Ověřování platnosti (5) Při definici šablony pro indikaci chybně zada-né hodnoty lze využít třídu AdornedEle-mentPlaceholder: může být použita pouze na úrovni definice šablony rezervuje místo pro zobrazení ovládacího prvku (potomka třídy UIElement), který může být zpřístupněn vlastností AdornedElement 25/05/2018