public override void OnNavigatedTo(NavigatedToEventArgs e, Dictionary<string, object> viewModelState) { int id = (int)e.Parameter; if (id == 0) { SelectedPlanetVM = new PlanetViewModel(); SelectedPlanetVM.Id = id; } base.OnNavigatedTo(e, viewModelState); }
// Add AppBarButton private void AddPlanet() { SelectedPlanetVM = new PlanetViewModel(); navigationService.Navigate("LifecycleAdd", SelectedPlanetVM.Id); //navigationService.Navigate("LifecycleAdd", SelectedPlanetVM); // 1/8/2016 - Even though I have 'SessionStateService.RegisterKnownType(typeof(PlanetViewModel));' // in App.xaml.cs, when SelectedPlanetVM is passed in .Navigate I get this error: // Exception: "Session state service failed" // InnerExecption: "Unspecified error\r\n\r\nGetNavigationState doesn't support serialization of a parameter type // which was passed to Frame.Navigate." // 1/12/2016 - Here is a good discussion of the problem: // https://social.msdn.microsoft.com/Forums/en-US/ad753362-0d52-42b3-8917-b2897033ba49/getnavigationstate-doesnt-support-serialization-of-a-parameter-type-which-was-passed-to?forum=winappswithcsharp // Another: http://stackoverflow.com/questions/23896488/getnavigationstate-doesnt-support-serialization-of-a-parameter-type-which-was-p // Another: http://www.damirscorner.com/blog/posts/20120923-UsingSuspensionManagerForSavingApplicationState.html // Bottom Line: Pass the Id; if Id == 0, create a new PlanetViewModel; if Id != 0, GetPlanet(id) and map to PlanetViewModel. }
// PlanetVM -> Planet Mapper // TODO: use AutoMapper instead https://github.com/AutoMapper/AutoMapper/wiki private Planet MapPlanetVMToPlanet(PlanetViewModel planetVM) { return new Planet { Id = planetVM.Id, Name = planetVM.Name, ImagePath = planetVM.ImagePath, Mass = planetVM.Mass, Diameter = planetVM.Diameter, Gravity = planetVM.Gravity, LengthOfDay = planetVM.LengthOfDay, DistanceFromSun = planetVM.DistanceFromSun, OrbitalPeriod = planetVM.OrbitalPeriod, MeanTemperature = planetVM.MeanTemperature, NumberOfMoons = planetVM.NumberOfMoons }; }
// Add AppBarButton private void AddPlanet() { SelectedPlanetVM = new PlanetViewModel(); navigationService.Navigate("PlanetAdd", SelectedPlanetVM); }
// Add AppBarButton private void AddPlanet() { if (SelectedPlanetVM != null) { saveSelectedPlanetId = SelectedPlanetVM.Id; } SelectedPlanetVM = new PlanetViewModel(); IsInEditMode = true; RunAllCanExecuteChanged(); }