Maszyna stanów w MVVM. Czyli sterowanie widokiem.

Uczepiłem się ostatnimi czasy tego wzorca. Uczepiłem się na tyle, że w trakcie przygotowań jest mój autorski framework (może trochę za dużo powiedziane). Jednak nie o tym będzie w tym artykule. W czasie prac nad nową aplikacją na Windows Phone napotkałem pewne kłopoty. Jak to w MVVM, wywoływanie określonych zachowań interfejsu we View-Model zawsze stawia pewne znaki zapytania. Tym razem miałem do wyświetlenia różne komunikaty, w zależności od sytuacji. Jak to zrobić?

Dotychczasowe rozwiązanie

Do niedawna moim rozwiązaniem było stosowanie właściwości typu bool i odpowiedniego konwertera do typu Visibility. Jeżeli zaszła jakaś sytuacja we View-Model, automatycznie wartość właściwości była zmieniana. Problem się zaczyna, kiedy takich informacji musimy przechowywać dużo. Gorzej, jeżeli niektóre właściwości nie mają żadnego większego uzasadnienia poza kontrolą interfejsu użytkownika.

Prosta maszyna stanów

Skoro do pracy już zaprzęgłem konwertery, czemu by tego nie rozwinąć. Trudno powiedzieć, że wpadłem na jakiś genialny pomysł. Jest to coś, o czym myślałem od bardzo dawna tylko nie wykorzystywałem. Być może jest tak oczywisty, że część z Was już z tego korzysta. Mianowicie „zbudowałem” maszynę stanów w oparciu o wyliczenie oraz prosty konwerter i jego parametr.

public object Convert(object value, Type targetType, 
					  object parameter, CultureInfo culture)
{
	return value.ToString() == parameter.ToString() ? 
	Visibility.Visible : Visibility.Collapsed;
}

Enum to lista wszystkich możliwych stanów dla danej strony. Np. NoInternetConnection, SendingData, Connecting, Unknown itd… Informacja o aktualnym stanie jest przechowywana w VM i za pomocą konwerterów zamieniana na Visibility, w zależności od parametru konwertera. Czyli okienko komunikatu o wysyłaniu danych może mieć przy bindowaniu wartość SendingData, co pozwoli na łatwe porównania w metodzie Convert.

{Binding State, Converter={StaticResource KONWERTER}, 
ConverterParameter=NoInternetAccess}

Rozwiązanie to niesie ze sobą dodatkową korzyść. Możemy łączyć stany w jednej zmiennej. Należy tylko zmodyfikować konwerter. Poza tym możemy utworzyć kilka innych konwerterów, pozwalających nam kontrolować zachowanie całego widoku w określonych stanach.

Share

Jedna myśl nt. „Maszyna stanów w MVVM. Czyli sterowanie widokiem.

  1. Witam

    O ile wiem MEF jest dostępny w silverlight dla WP… xaml extensions też.

    Dlatego proponuje ci skorzystać z wzorca ServiceLocatora(czy czegoś w ten deseń) i skorzystać z powyższych dwóch narzędzi… użytek z tego taki, że koniec końców możemy mieć takie coś zamiast tego twojego:

    TextBlock Text={loc:App Path="State.Name"}

    A przykładowy namespace może wyglądać tak

    xmlns:loc="http://schemas.mojadomena.pl/mojframework/2012/locator"

    albo tak

    xmlns:cfg="http://schemas.mojadomena.pl/mojframework/2012/configuration"

    albo tak

    xmlns:lang="http://schemas.mojadomena.pl/mojframework/2012/locale"

    Zachęcam do rozgryzienia tej zagwostki powyżej. uczyni ciebie lepszym. 🙂

    Pozdrawiam

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Spam protection by WP Captcha-Free