MVVM – #1 – Koncepcja

Jako, że projekt, który rozwijam w ramach konkursu “Daj Się Poznać” używa wzorca projektowego MVVM, chciałbym przedstawić idee tego wzorca. Postanowiłem, że zrobię z tego tematu serię artykułów. W tym wpisie, zależy mi na przedstawieniu koncepcji tego wzorca, natomiast w kolejnych pokażę jak za pomocą narzędzia MVVM Toolkit ułatwić sobie jego implementację w projekcie WPF oraz opiszę korzyści wynikające z jego korzystania. Należy pamiętać, że sam wzorzec będę opisywał w kontekście platformy WPF oraz mechanizmów, które udostępnia do łatwiejszej jego implementacji.

Koncepcja

Poniżej znajduję się diagram, który przedstawia sposób komunikacji pomiędzy poszczególnymi warstwami:

Wzorzec Model-View-ViewModel (MVVM), opiera się na wydzieleniu odpowiednich warstw w systemie, w celu podziału zadań oraz zmniejszenia zależności pomiędzy klasami. Mamy więc klasy modelu danych, których zadaniem jest przechowywanie danych właśnie oraz ich ewentualną walidację. Klasy tej warstwy powinny być jak najprostsze pod względem budowy. Pod żadnym pozorem nie mogą odwoływać się do warstwy modelu widoku a tym bardziej do samego widoku.

Warstwa widoku, zawiera interfejs użytkownika (UI) i jest odpowiedzialna na kontakt oraz interakcję z użytkownikiem. W WPF, za warstwę widoku będzie odpowiedzialny kod XAML. Szczególnie związany z kodem XAML jest tzw. code-behind. Możemy o nim myśleć jak zapleczu kodu XAML a jego zadanie jest podobne do klas obsługujących metody zdarzeniowe w Windows Forms. Zgodnie z koncepcją MVVM kod ten powinien być ograniczony do minimum.

Warstwa widoku komunikuje się z warstwą modelu widoku za pomocą komend oraz wiązania danych (data binding). Jeżeli tworzyłeś aplikacje w Windows Forms, o komendach możesz myśleć jak o metodach zdarzeniowych podpiętych do poszczególnych kontrolek w definicji widoku. Natomiast wiązanie danych polega na odwoływaniu się do właściwości podpiętego modelu widoku jako źródła danych. Jest to świetny mechanizm, którego korzyści oraz działanie przestawię w następnych postach.

Spoiwem, które łączy model oraz widok jest warstwa modelu widoku. Jej zadaniem jej udostępnienie danych dla widoku oraz wymianę informacji z modelem. Przez wymianę informacji należy rozumieć pobieranie danych z modelu oraz jego aktualizację. Podczas implementacji tej warstwy bardzo ważną kwestią jest poprawna aktualizacja danych. Nie może wystąpić sytuacja, kiedy model dysponuje nie aktualnymi danymi w stosunku do widoku lub na odwrót. Aby sobie z tym poradzić korzysta się z interfejsu INotifyPropertyChanged – jego zadaniem zgodnie z nazwą jest powiadamianie o zmianach.

Bardzo często w modelu widoku przechowuje się referencję do modelu jako prywatne pole klasy a poszczególne właściwości składające się na model są udostępniane jako publiczne właściwości w modelu widoku, z których wtedy korzysta widok.

Zwięźle

Ten wpis miał na celu pokrótce przedstawić koncepcję wzorca MVVM. W kolejnym wpisie przedstawię MVVM Toolkit, które jak znacząco usprawnia tworzenie aplikacji.

Mam coś dla Ciebie

Zapisz się do mojego newslettera, a ja prześlę Ci zbiór kilkunastu praktycznych wskazówek dla programisty aplikacji mobilnych.

Menu