Example #1
0
 private INavigationParameters CreateDefaultParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode)
 {
     parameters = parameters ?? new NavigationParameters();
     parameters.SetNavigationMode(mode);
     parameters.SetNavigationService(_navigationService);
     parameters.SetSyncronizationContext(_syncContext);
     return(parameters);
 }
Example #2
0
        private async Task <INavigationResult> OrchestrateAsync(
            INavigationParameters parameters,
            Prism.Navigation.NavigationMode mode,
            Func <Task <bool> > navigate)
        {
            // setup default parameters

            parameters = CreateDefaultParameters(parameters, mode);

            // pre-events

            var old_vm = (_frame.Content as Page)?.DataContext;

            if (old_vm == null)
            {
                Debug.WriteLine($"[From]View-Model is null.");
            }
            else if (!await CanNavigateAsync(parameters, old_vm))
            {
                return(this.Failure($"[From]{old_vm}.CanNavigateAsync returned false."));
            }
            else if (!CanNavigate(parameters, old_vm))
            {
                return(this.Failure($"[From]{old_vm}.CanNavigate returned false."));
            }

            // navigate

            var success = await NavigateFrameAsync(navigate);

            Debug.WriteLine($"{nameof(FrameFacade)}.{nameof(OrchestrateAsync)}.NavigateFrameAsync() returned {success}.");
            if (!success)
            {
                return(this.Failure("NavigateFrameAsync() returned false."));
            }

            var new_page = _frame.Content as Page;

            if (new_page == null)
            {
                throw new Exception("There is no new page in Frame after Navigate.");
            }

            // post-events

            if (old_vm != null)
            {
                OnNavigatedFrom(parameters, old_vm);
            }

            var new_vm = new_page?.DataContext;

            if (new_vm == null)
            {
                if (Mvvm.ViewModelLocator.GetAutowireViewModel(new_page) == null)
                {
                    // developer didn't set autowire, and did't set datacontext manually

                    // set the autowire & see if we can find it for them
                    Mvvm.ViewModelLocator.SetAutowireViewModel(new_page, true);

                    // TODO: I wonder if I need to delay for a second?
                    new_vm = new_page.DataContext;
                }
            }

            if (new_vm == null)
            {
                Debug.WriteLine($"[To]View-Model is null.");
            }
            else
            {
                await OnNavigatedToAsync(parameters, new_vm);

                OnNavigatingTo(parameters, new_vm);
                OnNavigatedTo(parameters, new_vm);
            }

            // refresh-bindings

            BindingUtilities.UpdateBindings(new_page);

            // finally

            return(this.Successful());
        }
Example #3
0
 private INavigationParameters CreateDefaultParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode)
 {
     parameters = parameters ?? new NavigationParameters();
     parameters.SetNavigationMode(mode);
     parameters.SetNavigationService(_navigationService);
     parameters.SetDispatcher(_dispatcher);
     return(parameters);
 }
Example #4
0
        private async Task <INavigationResult> OrchestrateNavigation(INavigationParameters parameters, Prism.Navigation.NavigationMode mode, Func <bool> navigate)
        {
            // default parameters

            parameters = parameters ?? new NavigationParameters();
            parameters.SetNavigationMode(mode);
            parameters.SetNavigationService(_navigationService);

            // hold prev vm

            var old_vm = (_frame.Content as Page)?.DataContext;

            // CanNavigateAsync

            if (old_vm is IConfirmNavigationAsync old_vm_confirma)
            {
                if (!await old_vm_confirma.CanNavigateAsync(parameters))
                {
                    return(NavigationResult.Failure($"{old_vm_confirma}.CanNavigateAsync returned false."));
                }
            }

            // CanNavigate

            if (old_vm is IConfirmNavigation old_vm_confirms)
            {
                if (!old_vm_confirms.CanNavigate(parameters))
                {
                    return(NavigationResult.Failure($"{old_vm_confirms}.CanNavigate returned false."));
                }
            }

            // navigate

            await NavigateInternalAsync(navigate);

            // OnNavigatedFrom

            if (old_vm is INavigatedAware old_vm_ed)
            {
                old_vm_ed.OnNavigatedFrom(parameters);
            }

            // hold new vm

            var new_vm = (_frame.Content as Page)?.DataContext;

            // OnNavigatingTo

            if (new_vm is INavigatingAware new_vm_ing)
            {
                new_vm_ing.OnNavigatingTo(parameters);
            }

            // OnNavigatedTo

            if (new_vm is INavigatedAware new_vm_ed)
            {
                new_vm_ed.OnNavigatedTo(parameters);
            }

            // finally

            return(NavigationResult.Successful());
        }
Example #5
0
        private async Task <INavigationResult> OrchestrateAsync(
            INavigationParameters parameters,
            Prism.Navigation.NavigationMode mode,
            Func <Task <bool> > navigate)
        {
            // setup default parameters

            parameters = CreateDefaultParameters(parameters, mode);

            // pre-events

            var old_vm = (_frame.Content as Page)?.DataContext;

            if (old_vm == null)
            {
                Debug.WriteLine($"[From]View-Model is null.");
            }
            else if (!await CanNavigateAsync(parameters, old_vm))
            {
                return(NavigationResult.Failure($"[From]{old_vm}.CanNavigateAsync returned false."));
            }
            else if (!CanNavigate(parameters, old_vm))
            {
                return(NavigationResult.Failure($"[From]{old_vm}.CanNavigate returned false."));
            }

            // navigate

            var success = await NavigateFrameAsync(navigate);

            Debug.WriteLine($"{nameof(FrameFacade)}.{nameof(OrchestrateAsync)}.NavigateFrameAsync() returned {success}.");
            if (!success)
            {
                return(NavigationResult.Failure("NavigateFrameAsync() returned false."));
            }

            var new_page = _frame.Content as Page;

            if (new_page == null)
            {
                throw new Exception("There is no new page in Frame after Navigate.");
            }

            // post-events

            if (old_vm != null)
            {
                OnNavigatedFrom(parameters, old_vm);
            }

            var new_vm = new_page?.DataContext;

            if (new_vm == null)
            {
                if (Central.Registry.TryGetRegistration(_frame.CurrentSourcePageType, out var info) && info.ViewModel != null)
                {
                    new_page.DataContext = new_vm = Central.Container.Resolve(info.ViewModel);
                }
            }

            if (new_vm == null)
            {
                Debug.WriteLine($"[To]View-Model is null.");
            }
            else
            {
                await OnNavigatedToAsync(parameters, new_vm);

                OnNavigatingTo(parameters, new_vm);
                OnNavigatedTo(parameters, new_vm);
            }

            // refresh-bindings

            BindingUtilities.UpdateBindings(new_page);

            // finally

            return(NavigationResult.Successful());
        }