U prethodnom postu vidjeli smo na koji način možemo manipulirati podacima u smislu sortiranja, grupiranja, te filtriranja podataka. Za ovaj put prezentiraćemo validiranje podataka u WPF odnosno DataValidation. U WPF postoji predefinisan model validiranja podataka tako da svaki tip izveden iz IDataErrorInfo interfejsa podržava validiranje podataka.
Implementacija validacije podataka
Početak ovog posta baziran je na prethodnom primjeru, a potrebno je implementirari validiranje podataka za naš model podataka. Valdaciju podataka moguće je implementirati na različitim konceptialnim modelima aplikacije. U ovom poglavlju validaciju ćemo implementirati na nivou našeg modela baze podataka. Validacija će se sastojati u tome da kad god unesemo datum veći od 1. Januara 2009 godine u datum narudžbe informacija o nepravilnom unosu upozoravaće nas prilikom svakog gubljenja fokusa date kontrole na našem interfejsu. Obzirom da smo validaciju pretpostavili na nivou modela, potrebno je klasu Orders derivirati iz interfejsa IdataErrorInfo da bi iskoristili ugrađeni mehanizam u WPF.
Otvorimo datoteku NorthWindKlase.cs te definišimo parcijanu deklaraciju klase Orders na sljedeći način:
partial class Order : IDataErrorInfo { #region IDataErrorInfo Members public string Error { get { return null; } } public string this[string columnName] { get { if (columnName == "OrderDate") if (OrderDate > newDateTime(2009, 1, 1)) return "Datum nije validan. Molimo ispravite datum."; return null; } } #endregion }
Klasa Order izvedena je iz dva interfejsa koja su definisana u dizajnerskog datoteci. U cs datoteci ovu klasu izvodimo iz još jednog interfejsa IdataErrorInfo. Ovaj interfejs obezbjedjuje implementaciju validacije podataka u WPF. Dvije implementacije je potrebno izvršiti i to za Property Error koja u ovom slučaju nije potrebna, a inače služi kada upravljamo sa više pogrešaka koje se mogu pojaviti u klasi Orders. Druga metoda je indexer u kojem prvo provjeravamo da li je vrijednost indexera posmatrani naziv kolone OrderDate. Zatim tekuću vrijednost provjeravamo, i ako vrijednost ne zadovoljava naše definisane kriterije vraćamo neprazan string koji u biti sadržava poruku pogreške.
Napomena: Kada u polju datuma ne postoji nikakva vrijednost (prazan string) ili vrijednost koja ne predstavlja datum, validacija takvih podataka je već implementirana tako da se takvi podaci neposmatraju ovom implementacijom. Naša validacija OrderDate kolone se sastoji u tome da ako smo definsiali datum koji je veći od 1. Januara 2009 godine, izbacuje se pogrešaka. Kada smo implementirali logiku validacije podataka u bussiness layeru, logiku je potrebno povezati sa UI kontrolama, odnosno sa TextBox kontrolom koja prikazuje OrderDate. Kada želimo da povežemo validaciju sa bilo kojom UI kontrlom postavljamo Property ValidatesOnDataErrors=True. Sa ovim je cijela implementacija validacije podataka iz bussiness layer povezana sa UI kontrolom.
Kada u ovoj fazi implementacije pokrenemo naš primjer i kad u polje OrderDate unesemo datum koji je veći od datuma 1. Januar 2009 godine, mehanizam validacije podataka se pokreće i dobijamo sljedeći sliku.
Sa slike vidimo da je tekstualna kontrola Order Date promjenila boju ivice na crvenu. Ovo je standardni šablon koji se koristi kada se pokrene mehanizam validacije. Medjutim, sa crvenom bojom ivice mi ništa više ne znamo od pogreške. Za ovaj primjer implementirat ćemo šablon koji će tekst pogreške koji je uhvaćen u bussiness layeru prikazati kao tooltip naše kontrole. Da bi ovo implementirali potrebmo je definisati Stil validacije podataka. Stil validacije podataka definišemo na sljedeći način:
<!--Šablon validacije podataka--> <Style TargetType="TextBox"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/> </Trigger> </Style.Triggers> </Style>
U biti gornja implementacija je implementacija stila za TextBox kontrolu koja u sebi sadrži implementaciju Triger (okidača) kad postoji pogreška u validaciji podataka. Kada se desi tada vrijednost ToolTipa date kontrole ima vrijednost teksta pogreške.
Sada kad pokrenemo aplikaciju te unesemo pogrešan datum kao u prethodnom primjeru, te odnesemo miša do date kontrole, pojavljuje se tooltip sa tekstom pogreške.
Kada smo definisali Stil za validaciju podataka za textbox kontrolu nismo ga definisali sa ključnom nazivom (x:Key=”stilValidacije“), što onda znači da dati stil automatski podešava sve textbox kontrole.
Sa ovim smo završili tutorijal o validaciji podataka.Izvorni kod za ovaj primjer možete skinuti sa ovog linka.