8. diel - PRIPOMIENKOVÉ narodenín v VB .NET WPF - Prepojenie vrstiev
V minulom dieli, PRIPOMIENKOVÉ narodenín vo VB.NET WPF - Logická vrstva , sme naprogramovali väčšinu logické vrstvy aplikácie.
Dnes aplikáciu sprevádzkujeme.
Oddelenie prezentácie a logiky
Teraz máme dokončenú tzv. Prezentačné časť aplikácie (formulára) a logickú časť (triedy). Tieto 2 vrstvy sa v aplikácii striktne oddeľujú, pretože inak je kód veľmi neprehľadný. Nikdy by ste nemali vykonávať výpočty, zápisy do súborov, databázy a podobné veci priamo v kóde formulára! Vždy si vytvoríme triedu, ktorá poskytuje príslušné metódy a túto triedu z formulára iba používame. Logika zostane v triede. Trieda by naopak vôbec nemala vedieť o formulári. Nemala by teda napr. Zobrazovať chybové hlášky, ale iba vyhadzovať v prípade chyby výnimky. Je potom na formulári, aby užívateľovi chybu zobrazil. Práve formulár je tá časť aplikácie, ktorá s užívateľom komunikuje. Žiadna iná to nerobí.
Ak vás napadlo, že naše jednoduchá kalkulačka, ktorú sme vytvorili v prvých dieloch seriálu, bola návrhové zle, máte pravdu. Z dôvodu jednoduchosti sme napísali výpočty rovno do obslužnej metódy tlačidla. Správne by sme mali mať nejakú triedu, ktorá by výsledky počítala a tú by sme z formulára iba volali. XAML a aj jeho CodeBehind je teda stále prezentačná vrstva aplikácie. XAML definuje ako formulár vyzerá, CodeBehind volá logiku, ktorú neobsahuje.
Dnes si teda ukážeme, ako sa to robí správne.
Prepojenie prezentácie a logiky
Prejdeme do CodeBehind formulára MainWindow a triede pridáme privátne atribút typu SpravceOsob, v ktorom rovno vytvoríme inštanciu správcu:
Private spravceosob As New SpravceOsob()
Inštancie správcu sa vytvorí pri vytvorení formulára a formulár s ňou ďalej bude komunikovať a tak vykonávať úkony, ktoré si želá užívateľ.
Pridávanie osôb
Aby sme niečo konečne tiež videli, prejdeme k pridávanie osôb. Najprv prejdeme do kódu formulára OsobaWindow, kde si rovnako ako v predchádzajúcom formulári pripravíme správcu osôb ako privátne atribút. Keby sme tu aj vytvorili jeho inštanciu, nebolo by nám to moc platné, pretože osoby by boli načítané v správcovi v hlavnom formulári. A načítať ich znovu by bolo neefektívne. Necháme si teda hotového a načítaného správcu odovzdať konštruktory a uložíme ho do pripravenej premennej:
Private spraveOsob As SpravceOsob Public Sub New(spravceosob As SpravceOsob) InitializeComponent() Me.spraveOsob = spravceosob End Sub
Teraz naklikne tlačidlo OK a do správcu pridáme osobu pomocou hodnôt, ktoré užívateľ do jednotlivých prvkov zadal. K hodnote v DatePickeru pristúpime pomocou vlastnosti SelectedDate, ktorá je nullovatelného typu DateTime.
Určite si spomínate, že metóda pridajte () vyvolá výnimku v prípade príliš krátkeho mená, nullového dáta alebo dáta v budúcnosti. Preto kód s pridaním vložíme do bloku try, za ktorým bude nasledovať blok catch. Ak výnimka v bloku try nastane, program sa ihneď presunie do bloku catch, kde pomocou MessageBox zobrazí chybovú hlášku. Ak by sme výnimku takto neošetrili, spôsobila by pád aplikácie.
Private Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click Try spraveOsob.Pridej(jmenoTextBox.Text, narozeninyDatePicker.SelectedDate) Close() Catch ex As Exception MessageBox.Show(ex.Message, "Chyba", MessageBoxButton.OK, MessageBoxImage.Exclamation) End Try End Sub
K správe výnimky sa dostaneme cez vlastnosť Message. Všimnite si tiež, že správe nastavujeme ikonku vykřičníčku. V metóde už neriešime žiadnu logiku a je vďaka tomu pomerne krátka.
V tomto formulári sme skončili. Presunieme sa späť do MainWindow, tentoraz do grafickej časti a naklikne tlačidlami pridatButton.
Private Sub pridatButton_Click(sender As Object, e As RoutedEventArgs) Handles pridatButton.Click Dim osobaWindow As New OsobaWindow(spravceosob) osobaWindow.ShowDialog() End Sub
V obslužné metóde tlačidla pridejButton vytvoríme novú inštanciu formulára OsobaWindow, ktoré odovzdáme miestneho správcu osôb. Na inštanciu následne zavoláme metódu ShowDialog (). Tá zobrazí nový formulár (rovnako ako metóda Show ()) ak tomu ešte zablokuje zvyšok aplikácie, ktorý sa zaktivní až v prípade, keď sa dialóg zatvorí. Výsledkom je, že sa s hlavným formulárom nedá pracovať kým dialóg nepotvrdíme či neukončíme. U dialógu (rozumejte pomocného formulára, ktorý slúži najčastejšie na zadanie údajov) sa toto väčšinou robí. Aj keď nám by v podstate nevadilo, keby užívateľ počas zadávania novej osoby aplikáciu používal a otvoril potrebné ďalšie dialóg na zadávanie.
Keď by sme aplikáciu teraz spustili, osobu by sme síce pridali do ObservableCollection, však by sme ju v listbox nevideli. Je to samozrejme z toho dôvodu, že listbox nie je na túto kolekciu napojený. Iste vás neprekvapí, že toho docielime pomocou binding.
Binding
Ak chceme bindovat, musíme oknu najprv nastaviť tzv. Kontext. To je objekt, ktorého vlastnosti budeme bindovat. To urobíme najjednoduchšie v konstruktoru okna pomocou nasledujúceho kódu:
DataContext = spravceOsob;
Inštancie správca osôb je teraz nastavená ako dátový kontext hlavného okna a my v tomto okne môžeme zobrazovať jej vlastnosti.
Presunieme sa do XAML a listbox dodáme atribút ItemsSource:
<ListBox Name="osobyListBox" Grid.Column="0" Grid.Row="2" Margin="0, 0, 0, 10" ItemsSource="{Binding Osoby}"/>
Tým hovoríme, že zdrojom položiek listbox je vlastnosť Osoby na kontextu, ktorým je správca osôb.
Skúste si aplikáciu spustiť a pridať nejaké osoby. Pridanej osoby sa ihneď objaví v listbox vďaka bindingům. Listbox vždy zobrazuje to, čo vracia metóda toString () objektu. U osôb teda zobrazuje ich meno. Podobne fungujú samozrejme aj ďalšie kontrolky, napr. ComboBox.
Odobratie užívateľov
Obslužná metóda tlačidla odebratButton bude vyzerať takto:
Private Sub odebratButton_Click(sender As Object, e As RoutedEventArgs) Handles odebratButton.Click If osobyListBox.SelectedItem <> Nothing Then spravceosob.Odeber(osobyListBox.SelectedItem) End If End Sub
Dôležitá je podmienka, ktorá zisťuje, či je v listbox vybraná nejaká položka. Ako vidíte, k vybranej položke sa dostaneme cez vlastnosť SelectedItem. Túto osobu odovzdáme metóde Odober na správcovi, ktorá ďalej vykoná fyzické odobratie z ObservableCollection.
Dnešný projekt je nižšie na stiahnutie a ja sa na vás teším nabudúce, PRIPOMIENKOVÉ narodenín v VB .NET WPF - binding , kedy budeme pokračovať v binding.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 95x (338.47 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB