private async Task PushViewModelWithPage(Page page, TinyViewModel viewModel, NavigationParameters parameters, bool modal = false, bool animate = true)
        {
            viewModel.PreviousViewModel            = currentViewModel; //This is the previous page model because it's push to a new one, and this is current
            viewModel.CurrentNavigationServiceName = currentViewModel.CurrentNavigationServiceName;

            if (string.IsNullOrWhiteSpace(viewModel.PreviousNavigationServiceName))
            {
                viewModel.PreviousNavigationServiceName = currentViewModel.PreviousNavigationServiceName;
            }

            viewModel.IsModal = modal;

            if (page is PopupPage)
            {
                await PopupNavigation.Instance.PushAsync((PopupPage)page, animate);
            }
            else
            {
                await TinyIoCLocator.Container.Resolve <INavigationService>(currentViewModel.CurrentNavigationServiceName).PushPage(page, modal, animate);
            }

            _ = viewModel.OnNavigatedToAsync(parameters);
            viewModel.OnNavigatedTo(parameters);
            if (page is INavigatedAware aware)
            {
                _ = aware.OnNavigatedToAsync(parameters);
                aware.OnNavigatedTo(parameters);
            }
        }
 public Task PushPage(Page page, TinyViewModel model, bool modal = false, bool animate = true)
 {
     if (modal)
     {
         return(Navigation.PushModalAsync(CreateContainerPageSafe(page)));
     }
     return((Detail as NavigationPage).PushAsync(page, animate)); //TODO: make this better
 }
 public static Page BindingPageModel(Page targetPage, TinyViewModel viewModel, NavigationParameters parameters = null)
 {
     viewModel.CurrentPage = targetPage;
     viewModel.CoreMethods = new ViewModelCoreMethods(targetPage, viewModel);
     viewModel.WireEvents();
     viewModel.InitAsync(parameters);
     targetPage.BindingContext = viewModel;
     viewModel.OnPageCreated();
     return(targetPage);
 }
        private async Task PushPageModelWithPage(Page page, TinyViewModel viewModel, bool modal = false, bool animate = true)
        {
            viewModel.PreviousViewModel            = currentViewModel; //This is the previous page model because it's push to a new one, and this is current
            viewModel.CurrentNavigationServiceName = currentViewModel.CurrentNavigationServiceName;

            if (string.IsNullOrWhiteSpace(viewModel.PreviousNavigationServiceName))
            {
                viewModel.PreviousNavigationServiceName = currentViewModel.PreviousNavigationServiceName;
            }

            viewModel.IsModal = modal;

            await TinyIOC.Container.Resolve <INavigationService>(viewModel.CurrentNavigationServiceName).PushPage(page, modal, animate);
        }
        public static Page ResolveViewModel(TinyViewModel viewModel, NavigationParameters parameters = null)
        {
            TinyIOC.Container.BuildUp(ref viewModel);
            var pageName = ViewModelMapper.GetPageTypeName(viewModel.GetType());
            var pageType = Type.GetType(pageName);

            if (pageType == null)
            {
                throw new Exception(pageName + " not found");
            }

            Page page = (Page)TinyIOC.Container.Resolve(pageType);

            return(BindingPageModel(page, viewModel, parameters));
        }
 public ViewModelCoreMethods(Page currentPage, TinyViewModel currentViewModel)
 {
     this.currentPage      = currentPage;
     this.currentViewModel = currentViewModel;
 }
        private async Task PushPageModel(TinyViewModel viewModel, NavigationParameters parameters, bool modal = false, bool animate = true)
        {
            var page = ViewModelResolver.ResolveViewModel(viewModel, parameters);

            await PushPageModelWithPage(page, viewModel, modal, animate);
        }
        private async Task PushPageModel(TinyViewModel viewModel, bool modal = false, bool animate = true)
        {
            var page = ViewModelResolver.ResolveViewModel(viewModel);

            await PushPageModelWithPage(page, viewModel, modal, animate);
        }
        public Task PushNewNavigationServiceModal(MasterDetailNavigationContainer masterDetailContainer, TinyViewModel basePageModel = null, bool animate = true)
        {
            var models = masterDetailContainer.Pages.Select(o =>
            {
                if (o.Value is NavigationPage)
                {
                    return(((NavigationPage)o.Value).CurrentPage.GetModel());
                }
                else
                {
                    return(o.Value.GetModel());
                }
            }).ToList();

            if (basePageModel != null)
            {
                models.Add(basePageModel);
            }

            return(PushNewNavigationServiceModal(masterDetailContainer, models.ToArray(), animate));
        }
        public Task PushNewNavigationServiceModal(TabbedNavigationContainer tabbedNavigationContainer, TinyViewModel baseViewModel = null, bool animate = true)
        {
            var models = tabbedNavigationContainer.TabbedPages.Select(o => o.GetModel()).ToList();

            if (baseViewModel != null)
            {
                models.Add(baseViewModel);
            }

            return(PushNewNavigationServiceModal(tabbedNavigationContainer, models.ToArray(), animate));
        }
 public Task PushNewNavigationServiceModal(INavigationService newNavigationService, TinyViewModel basePageModels, bool animate = true)
 {
     return(PushNewNavigationServiceModal(newNavigationService, new TinyViewModel[] { basePageModels }, animate));
 }