8. díl - Upomínač narozenin v VB .NET WPF - Propojení vrstev

Ostatní jazyky Visual Basic .NET WPF Upomínač narozenin v VB .NET WPF - Propojení vrstev

V minulém dílu našeho seriálu tutoriálů o tvorbě okenních aplikací v VB .NET WPF jsme naprogramovali většinu logické vrstvy aplikace. Dnes aplikaci zprovozníme.

Oddělení prezentace a logiky

Nyní máme dokončenou tzv. prezentační část aplikace (formuláře) a logickou část (třídy). Tyto 2 vrstvy se v aplikaci striktně oddělují, jelikož jinak je kód velmi nepřehledný. Nikdy byste neměli provádět výpočty, zápisy do souborů, databáze a podobné věci přímo v kódu formuláře! Vždy si vytvoříme třídu, která poskytuje příslušné metody a tuto třídu z formuláře pouze používáme. Logika zůstane ve třídě. Třída by naopak vůbec neměla vědět o formuláři. Neměla by tedy např. zobrazovat chybové hlášky, ale pouze vyhazovat v případě chyby výjimky. Je potom na formuláři, aby uživateli chybu zobrazil. Právě formulář je ta část aplikace, která s uživatelem komunikuje. Žádná jiná to nedělá.

Pokud vás napadlo, že naše jednoduchá kalkulačka, kterou jsme vytvořili v prvních dílech seriálu, byla návrhově špatně, máte pravdu. Z důvodu jednoduchosti jsme napsali výpočty rovnou do obslužné metody tlačítka. Správně bychom měli mít nějakou třídu, která by výsledky počítala a tu bychom z formuláře pouze volali. XAML a i jeho CodeBehind je tedy stále prezentační vrstva aplikace. XAML definuje jak formulář vypadá, CodeBehind volá logiku, kterou neobsahuje.

Dnes si tedy ukážeme, jak se to dělá správně.

Propojení prezentace a logiky

Přejdeme do CodeBehind formuláře MainWindow a třídě přidáme privátní atribut typu SpravceOsob, ve kterém rovnou vytvoříme instanci správce:

Private spravceosob As New SpravceOsob()

Instance správce se vytvoří při vytvoření formuláře a formulář s ní dále bude komunikovat a tak provádět úkony, které si přeje uživatel.

Přidávání osob

Abychom něco konečně také viděli, přejdeme k přidávání osob. Nejprve přejdeme do kódu formuláře OsobaWindow, kde si stejně jako v předchozím formuláři připravíme správce osob jako privátní atribut. Kdybychom zde i vytvořili jeho instanci, nebylo by nám to moc platné, jelikož osoby by byly načtené ve správci v hlavním formuláři. A načítat je znovu by bylo neefektivní. Necháme si tedy hotového a načteného správce předat konstruktorem a uložíme ho do připravené proměnné:

Private spraveOsob As SpravceOsob

Public Sub New(spravceosob As SpravceOsob)
        InitializeComponent()
        Me.spraveOsob = spravceosob
End Sub

Nyní naklikneme tlačítko OK a do správce přidáme osobu pomocí hodnot, které uživatel do jednotlivých prvků zadal. K hodnotě v DatePickeru přistoupíme pomocí vlastnosti SelectedDate, která je nullovatelného typu DateTime.

Určitě si vzpomínáte, že metoda Pridej() vyvolá výjimku v případě příliš krátkého jména, nullového data nebo data v budoucnosti. Proto kód s přidáním vložíme do bloku try, za kterým bude následovat blok catch. Pokud výjimka v bloku try nastane, program se ihned přesune do bloku catch, kde pomocí MessageBoxu zobrazí chybovou hlášku. Pokud bychom výjimku takto neošetřili, způsobila by pád aplikace.

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

Ke zprávě výjimky se dostaneme přes vlastnost Message. Všimněte si také, že zprávě nastavujeme ikonku vykřičníčku. V metodě již neřešíme žádnou logiku a je díky tomu poměrně krátká.

V tomto formuláři jsme skončili. Přesuneme se zpět do MainWindow, tentokrát do grafické části a naklikneme tlačíko 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é metodě tlačítka pridejButton vytvoříme novou instanci formuláře OsobaWindow, které předáme místního správce osob. Na instanci následně zavoláme metodu ShowDialog(). Ta zobrazí nový formulář (stejně jako metoda Show()) a k tomu ještě zablokuje zbytek aplikace, který se zaktivní až v případě, kdy se dialog zavře. Výsledkem je, že se s hlavním formulářem nedá pracovat dokud dialog nepotvrdíme či neukončíme. U dialogu (rozumějte pomocného formuláře, který slouží nejčastěji k zadání dat) se toto většinou dělá. I když nám by v podstatě nevadilo, kdyby uživatel během zadávání nové osoby aplikaci používal a otevřel třeba další dialog k zadávání.

Když bychom aplikaci nyní spustili, osobu bychom sice přidali do ObservableCollec­tion, nicméně bychom ji v ListBoxu neviděli. Je to samozřejmě z toho důvodu, že ListBox není na tuto kolekci napojený. Jistě vás nepřekvapí, že toho docílíme pomocí Bindingu.

Binding

Pokud chceme bindovat, musíme oknu nejprve nastavit tzv. kontext. To je objekt, jehož vlastnosti budeme bindovat. To uděláme nejjednodušeji v konstruktoru okna pomocí následujícího kódu:

DataContext = spravceOsob;

Instance správce osob je nyní nastavena jako datový kontext hlavního okna a my v tomto okně můžeme zobrazovat její vlastnosti.

Přesuneme se do XAMLu a ListBoxu dodáme atribut ItemsSource:

<ListBox Name="osobyListBox" Grid.Column="0" Grid.Row="2" Margin="0, 0, 0, 10" ItemsSource="{Binding Osoby}"/>

Tím říkáme, že zdrojem položek ListBoxu je vlastnost Osoby na kontextu, kterým je správce osob.

Zkuste si aplikaci spustit a přidat nějaké osoby. Přidané osoby se ihned objeví v ListBoxu díky bindingům. ListBox vždy zobrazuje to, co vrací metoda ToString() objektu. U osob tedy zobrazuje jejich jméno. Podobně fungují samozřejmě i další kontrolky, např. ComboBox.

Binding u WPF ListBoxu v VB .NET
Odebrání uživatelů

Obslužná metoda tlačítka odebratButton bude vypadat 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 podmínka, která zjišťuje, zda je v ListBoxu vybraná nějaká položka. Jak vidíte, k vybrané položce se dostaneme přes vlastnost SelectedItem. Tuto osobu předáme metodě Odeber na správci, která dále vykoná fyzické odebrání z ObservableCollec­tion.

Dnešní projekt je níže ke stažení a já se na vás těším příště, kdy budeme pokračovat v bindingu.


 

Stáhnout

Staženo 72x (338.47 kB)
Aplikace je včetně zdrojových kódů v jazyce VB.NET

 

  Aktivity (1)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!