Implementacja Nawigacji w Xamarin.Forms

nawigacja_w_mvvmLight
W poprzednim poście opisałem jak zaimplementować wzorzec MVVM z użyciem biblioteki MVVM Light. Ten post będzie o tym w jaki sposób zaimplementowałem nawigację w aplikacji Xamarin.Forms

Domyślna nawigacja w Xamarin.Forms odbywa się w tzw. Code behind poprzez odwoływanie się do klasy Navigation.  Chcąc zachować wzorzec MVVM i utrzymać separację widoków od viewmodeli, postanowiłem zaimplementować usługę nawigacji na podstawie tego wpisu oraz prezentacji z 2014 Evolve talk

Impementacja i konfiguracja

Dodajmy implementacje klasy NavigationService napisanej przez twórcę biblioteki MVVM Light.

Następnie w klasie ViewModelLocator dodajmy klucze, które będą nam służyć jako odwołania do widoków:

Teraz w klasie App skonfigurujmy naszą usługę i zarejestrujmy ją do kontenera IOC, tak aby można się do niej odnosić z każdego ViewModelu:

ViewModele

Pozostało nam teraz wstrzyknięcie uprzednio zarejestrowanej usługi nawigacji do ViewModelu oraz stworzenie odpowiednich komend. W tym przypadku skorzystamy z klasy RelayCommand, która jest implementacją interfejsu ICommand w bibliotece MVVM Light.

Na koniec jeszcze “zbindowanie” naszej komendy do widoków…

Nawigacja

Poniższy fragment kodu przedstawia sposoby nawigacji z wykorzystaniem wyżej opisanej usługi nawigacji.

Na zakończenie

W tym poście została przedstawiona jedna z wielu możliwości implementacji usługi nawigacji z pomocą biblioteki MVVM Light. Mam nadzieję, że skoro dotarłeś do tego miejsca, to w jakimś stopniu ten post Ci się przydał. W następnym poście spróbuję nadać wygląd aplikacji oraz być może opiszę coś co się nazywa “Events into commands“.

  • Pingback: Hard Training: Nawigacja między widokami - Thinking in code()

  • valeryi

    I implemented but it still doesnt work. How should App.cs and ViewModelLocator.cs look like? I have problem with registering ViewModel which uses injected interface in constructor. Compiler is looking for class ViewModel() but i have ViewModel(IService service, etc..) and it cannot be resolved. Shouldnt it happen dynamically? I mean register as non-parameter contstructor and then compliler will take job to pass services etc by yourself?. Thanks in advance for explaining this to me.

    • Hey Valeryi
      Thank you for your comment. I don’t have access to programming environment at this moment. I think you can check if maybe you have more than one of ViewModel classes or constructor with same name and constructor is looking for the one without parameter.

  • Hey Valeryi
    Thank you for your comment. I don’t have access to programming environment at this moment. I think you can check if maybe you have more than one of ViewModel classes or constructor with same name and constructor is looking for the one without parameter.