Navigacija za Windows 8.1 in Windows Phone 8.1 v MVVM

Pred kratkim sem spisal kodo za navigacijo med stranmi kar iz view modelov, prenašanje parametrov med stranmi, popolnoma ločen od UI-ja in na prenosljiv način. Kot za primer sem objavil izvirno kodo, ki jo lahko uporabite tudi v svojih lastnih projektih ali pa jo modificirate po želji. Pozneje bom mogoče napisal razlago, kako si lahko pišete svoj MVVM navigacijski sistem.

Koda je v celoti komentirana, zato bom tukaj napisal le korake, kako uporabiti knjižnico. Potrebovali boste Visual Studio 2013 Update 2. Windows Phone 8.0 trenutno ni podprt, ampak že delam tudi na tem.

Knjižnica Zenicy.NavigationUtility vsebuje vse kar potrebujete za MVVM navigacijo za Windows in Windows Phone 8.1 in je neodvisna od kakršne koli NuGet knjižnice. Če vas zanima implementacija, si poglejte WindowsNavigationService.

Namestitev:


1. Dodajte projekt Zenicy.NavigationUtility, tam kjer imate view modele.

2. V App.xaml.cs v metodi OnLaunched po inicializaciji rootFrame (pred if (rootFrame.Content == null)) dodajte to kodo:

WindowsNavigationService navigationService = new WindowsNavigationService();

3. Mapirajte view modele s dejanskimi stranmi, omogočite avtomatično nastavljanje DataContext strani in uporabite navigationService v vašem najljubšem IoC ali dependency injection knjižnici. Jaz uporabljam MVVM Light libraries only. Primer:

navigationService.ViewModelRouting.Add(typeof(HomeViewModel), typeof(MainPage));
navigationService.ViewModelRouting.Add(typeof(WithoutParameterViewModel), typeof(WithoutParameterPage));
navigationService.ViewModelRouting.Add(typeof(WithParametersViewModel), typeof(WithParameterPage));

// Allows automatic
navigationService.AutomaticallySetViewModelsAsDataContext();

SimpleIoc.Default.Register<INavigationService>(() => navigationService);

4. Staro navigacijo zamenjamo s novo. Ta bo navigirala na view model namesto na stran:

navigationService.NavigateToViewModel<HomeViewModel>(e.Arguments);

5. View modelom implementiramo INavigationViewModel. V demo aplikaciji je CommonViewModel, ki implementira navigacijsko logiko za vse view modele.

6. S pomočjo IoC ali DI (dependency injectiona) pridobite navigation service, ki ste ga inicializirali v 2. koraku. Nato lahko izvedete navigacijo na enak način kot v 4. koraku. Primer:

INavigationService navigationService = SimpleIoc.Default.GetInstance<INavigationService>();
navigationService.NavigateToViewModel<WithoutParameterViewModel>();

7. Opcijsko. Dodajte svoj view model na stran kot design time objekt:

<d:Page.DataContext>
    <viewModels:HomeViewModel />
</d:Page.DataContext>

Ta korak vam olajša delo pri nastavljanju data bindingov in če imate design podatke za view model, se ti tudi prikažejo na strani.

8. Bonus. S pomočjo NavigatedTo in NavigatedFrom lahko implementirate stvari kot so share, settings, play to contract kot tudi druge stvari, katere morate odstraniti ob izhodu strani. Poglejte si WithParametersViewModel. Tukaj je implementiran share contract.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: