public virtual Page CreatePage(Type viewType, MvxViewModelRequest request, MvxBasePresentationAttribute attribute) { var page = Activator.CreateInstance(viewType) as Page; if (page is IMvxPage contentPage) { if (request is MvxViewModelInstanceRequest instanceRequest) { contentPage.ViewModel = instanceRequest.ViewModelInstance; } else { contentPage.ViewModel = ViewModelLoader.LoadViewModel(request, null); } } if (attribute is MvxPagePresentationAttribute pageAttribute) { if (string.IsNullOrEmpty(page.Title) && !string.IsNullOrEmpty(pageAttribute.Title)) { page.Title = pageAttribute.Title; } if (string.IsNullOrEmpty(page.Icon) && !string.IsNullOrEmpty(pageAttribute.Icon)) { page.Icon = pageAttribute.Icon; } } return(page); }
protected async Task <MvxViewModelInstanceRequest> NavigationRouteRequest <TParameter>( string path, TParameter param, IMvxBundle?presentationBundle = null) where TParameter : notnull { ValidateArguments(path, param); if (!TryGetRoute(path, out var entry)) { throw new MvxException($"Navigation route request could not be obtained for path: {path}"); } var regex = entry.Key; var match = regex.Match(path); var paramDict = BuildParamDictionary(regex, match); var parameterValues = new MvxBundle(paramDict); var viewModelType = entry.Value; var request = new MvxViewModelInstanceRequest(viewModelType) { PresentationValues = presentationBundle?.SafeGetData(), ParameterValues = parameterValues.SafeGetData() }; if (viewModelType.GetInterfaces().Contains(typeof(IMvxNavigationFacade))) { var facade = (IMvxNavigationFacade)_iocProvider.IoCConstruct(viewModelType); try { var facadeRequest = await facade.BuildViewModelRequest(path, paramDict).ConfigureAwait(false); if (facadeRequest == null) { throw new MvxException($"{nameof(MvxNavigationService)}: Facade did not return a valid {nameof(MvxViewModelRequest)}."); } request.ViewModelType = facadeRequest.ViewModelType; if (facadeRequest.ParameterValues != null) { request.ParameterValues = facadeRequest.ParameterValues; } request.ViewModelInstance = ViewModelLoader.LoadViewModel(request, param, null); } catch (Exception ex) { ex.MvxWrap($"{nameof(MvxNavigationService)}: Exception thrown while processing URL: {path} with RoutingFacade: {viewModelType}"); } } else { request.ViewModelInstance = ViewModelLoader.LoadViewModel(request, param, null); } return(request); }