Daniel Vittek

Vývojářský blog - Daniel Vittek

Podle kategorie

MODERNÍ WPF APLIKACE A VIEW MODEL

Daniel Vittek       15. 1. 2016             3393 zobrazení

V poslední době jsem se na několika místech setkal s případem špatné implementace view modelu v moderních WPF aplikacích. Rozhodl jsem se to tedy formou tohoto článku vysvětlit.

Ať už využíváte jakýkoliv objektový návrh aplikace, vždy se snažíte alespoň o základní rozdělení modelu, view a controleru (MVC). Hodně lidí momentálně přechází z vývoje starých WinForm aplikací na nové WPF (ať už desktopové, či Windows 8/8.1/10) a jsou trošku zmatení novým bindováním view modelu v jazyku XAML.

Z jednoduché logické úvahy vyplývá, že někdy je potřeba umět k view modelu přistoupit jak z XAML části aplikace, tak z nějaké klasické C# třídy(.cs).

Představme si třídu; klasický view model například s jedním label stringem a jednou visibilitou. Již několikrát jsem se setkal s případy, kdy se někdo potýkal s nefunkčností takto jednoduchého view modelu, i přesto že si byl na 100% jistý, že všechno udělal správně. V XAML části bylo správně nabindované rozhraní mezi view modelem a konkrétní komponentou a v logické části programu (z nějaké modelové třídy) byly správně naplňované hodnoty view modelu, ale i přesto to prostě "záhadně" nefungovalo.

Problém je u 90% vždy stejný. Při vytváření proměnné našeho view modelu v XAML části totiž (logicky) dochází k vytvoření nové instance objektu, a to je třeba si uvědomit. Nemůžeme tedy po sléze (například v MainPage.xaml.cs) vytvářet novou instanci a očekávat, že se nám po vyplnění hodnot ve view něco změní.

Řešení se zdá být celkem jednoduché. Řeknete si, proč neudělat ze třídy ViewModel singleton (jedináčka). Takové řešení by bylo nejspíše nejlepší a nejelegantnější, bohužel je ale nemožné implementovat. V XAML části totiž nemůžeme přistoupit ke statické metodě "getInstance". Problém se tedy musí vyřešit jinak.

Podle mě je nejlepší způsob si buď vytvořit XAML globální proměnnou v App.xaml a tak k našemu view modelu mít přístup odkudkoliv, nebo vytvářet náš view model globálně v rámci jen našeho jednoho view (MainPage.xaml) a inicializovat v kódové části view (MainPage.xaml.cs). Tímto způsobem dosáhneme jednoduchého přenášení jedné instance view modelu mezi třídami, dodržíme jednoduchý a elegantní způsob bindování a neporušíme (téměř) žádná pravidla i nejzákladnějšího objektového návrhu MVC.

  XAML:
<Window.Resources>
        <ViewModel:MainWindowViewModel x:Key="MainWindowViewModel" />
</Window.Resources>

C#:
public static MainWindowViewModel MainWindowViewModel = Resources["MainWindowViewModel"] as MainWindowViewModel;

Doufám, že byl tento malý tutoriálek alespoň někomu užitečný a jako vždy, hodně štěstí a málo bugů! :)

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback