2013-04-22 9 views
11

W MvvmCross v3 używam ShowViewModel, aby przejść do różnych stron. Przed konwersją na Mvx użyłbym metody NavigationService.GoBack(), aby powrócić do poprzedniej strony. Zaletą jest to, że strona nie jest ponownie tworzona.Jaki jest najlepszy sposób obsługi programu GoBack dla różnych platform MvvmCross (v3)?

Ponieważ metoda GoBack jest platformą specyficzną dla WP, WInRT, Silverlight, jaki jest najlepszy sposób na przywrócenie poprzedniej strony, aby model widoku pozostał niezależny od platformy?

Jednym z rozwiązań może być użycie ShowViewModel przekazywanie niektórych danych, które widok może zobaczyć, a następnie w przypadku WP/WinRT, wywołanie RemoveBackEntry z widoku. Ale z Mvx jest prawdopodobnie lepszy sposób.

Odpowiedz

18

W MvvmCross v3 udostępniliśmy specjalny mechanizm umożliwiający ViewModels wysyłanie wiadomości do interfejsu użytkownika, który chciałby zmienić bieżącą prezentację.

Ten mechanizm to ChangePresentation(MvxPresentationHint hint) i zapewnia routing wiadomości - wskazówek prezentacji - od ViewModels do Presenter.

W jaki sposób Presenter obsługuje te wiadomości, zależy od platformy i aplikacji.

Ten mechanizm komunikatów jest bardzo ogólny i może być wykorzystywany do wszelkiego rodzaju czynności w przyszłości - np. twórcy mogą dostarczać podpowiedzi, które zmieniają układ interfejsu użytkownika, który podkreśla część interfejsu użytkownika, co zmusza użytkownika do skupienia się na określonej kontroli, która powoduje wyświetlanie lub ukrywanie SIP itp.


W przypadku zamknięcia widoku modelu, podajemy specjalizację MvxPresentationHint - MvxClosePresentationHint - i metody pomocnika w klasie bazowej MvxViewModel:

protected bool Close(IMvxViewModel viewModel) 
    { 
     return ChangePresentation(new MvxClosePresentationHint(viewModel)); 
    } 

Aby korzystać z tej ViewModel może zadzwoń Close(this)

Kiedy to się nazywa, prezenter w swoim interfejsie otrzyma wiadomość o sposobie ChangePresentation:

public interface IMvxViewPresenter 
{ 
    void Show(MvxViewModelRequest request); 
    void ChangePresentation(MvxPresentationHint hint); 
} 

W ogólnym/typowym przypadku - gdzie ViewModel który jest zamknięty jest dołączony do widoku, który jest najwyższy Activity/Page/UIViewController, prezenterzy domyślne w MvvmCross będzie w stanie obsłużyć tę wiadomość i będzie mógł do GoBack w systemie Windows, do Finish w systemie Android oraz do PopViewController w systemie iOS.

Jeśli jednak Twój interfejs jest bardziej skomplikowany - np. jeśli ViewModel chcesz Close faktycznie odpowiada Tab, Flyout, SplitView okienku, itp., lub jeśli ViewModel odpowiada innemu niż aktualny najwyższy widok w hierarchii - to musisz podać niestandardowego prezentera implementacja - i ta implementacja będzie musiała wykonać specyficzną dla platformy i aplikacji logikę obsługi Close.


Powyższa wskazówka jest to, co ja polecam użyć ...

Jednakże, jako alternatywa:

Jeśli było czuć ten ChangePresentation(MvxPresentationHint hint) mechanizm był po prostu zbyt dużej gramaturze/przesadą do aplikacji, możesz też, oczywiście, przejść do niestandardowego lub opartego na mechanizmie opartego na Message.

Jedna próbka, która robi to próbka CustomerManagement - zapewnia implementację niestandardowy IViewModelCloser na każdej platformie - patrz:

+0

Widzę i jak powiedziałeś, że można dziedziczyć po prezenterach platform, przesłonić ChangePresenter i powiedzieć Mvx, aby użył nowego prezentera. –

3

Nie jestem do końca pewien co do mvvmcross, ale w MVVM Light zwykle wykonuje się interfejs INavigationService, który eksponuje te metody.

Następnie każda platforma implementuje ten interfejs w specyficzny dla platformy sposób (w WP na przykład poprzez uzyskanie odniesienia do bieżącej ramki i jej zawartości). Ta specyficzna dla platformy instancja może następnie wykonać wszystkie prawidłowe działania, aby upewnić się, że wzorzec nawigacji jest poprawnie zaimplementowany.

Twoje ViewModels mogą następnie uzyskać odwołanie do instancji usługi INavigationService poprzez Container Dependency. W ten sposób Twoja maszyna wirtualna jest niezależna od specyfiki nawigacji na platformie.

ja też napisał na blogu o tym, jak korzystać z interfejsów wystawiać wspólne API dla specyfiki platformy: http://www.kenneth-truyers.net/2013/02/24/patterns-for-sharing-code-in-windows-phone-and-windows-8-applications/

Przykład na blogu jest o Isolated Storage, ale te same zasady mają zastosowanie do nawigacji (lub dowolna funkcja, która ma różne implementacje na różnych platformach).

+2

Dobrze, ale z Mvx wszystkie modele widoku dla wszystkich platform są dostępne w przenośnej bibliotece klasy. Tak więc nawigacja jest wyodrębniana za pomocą ShowViewModel w MvxNavigatingObject. I jeśli z jakiegoś powodu wszystkie platformy nie obsługują czegoś takiego jak GoBack, to nie jest to chyba rdzeń Mvx. –

+0

OK, nie wiedziałem o tym. Tak jak powiedziałem, nie pracowałem z MVVMcross, więc może moje punkty nie są ważne w twojej sytuacji. Jednak byłoby to rozwiązanie do dziedziczenia mvxNavigationObject i dodać tę metodę (oczywiście streszczenie)? To dzikie domysły, może to w ogóle nie ma sensu. – Kenneth

+0

Dodałem odpowiedź - @ Ogólne punkty Kennetha są na miejscu (więc mam + 1ed).Całą moją odpowiedzią jest dostarczenie szczegółowych informacji na temat sposobu, w jaki udostępniliśmy tę abstrakcję w MvvmCross przy użyciu API "ChangePresentation". Oprócz udostępnienia tego interfejsu API udostępniamy również wtyczki, które są skierowane również na takie rzeczy jak FileStorage :) – Stuart

Powiązane problemy