protected virtual void HandleOpenedViewModels(INavigationContext context)
        {
            var viewModelFrom = context.GetData(NavigationConstants.DoNotTrackViewModelFrom) ? null : context.ViewModelFrom;
            var viewModelTo   = context.GetData(NavigationConstants.DoNotTrackViewModelTo) ? null : context.ViewModelTo;

            lock (_openedViewModels)
            {
                List <WeakReference> list;
                if (!_openedViewModels.TryGetValue(context.NavigationType, out list))
                {
                    list = new List <WeakReference>();
                    _openedViewModels[context.NavigationType] = list;
                }
                if (context.NavigationMode == NavigationMode.New && viewModelTo != null)
                {
                    list.Add(ServiceProvider.WeakReferenceFactory(viewModelTo));
                }
                else if ((context.NavigationMode == NavigationMode.Refresh || context.NavigationMode == NavigationMode.Back) && viewModelTo != null)
                {
                    WeakReference viewModelRef = null;
                    for (int i = 0; i < list.Count; i++)
                    {
                        var target = list[i].Target as IViewModel;
                        if (target == null || ReferenceEquals(target, viewModelTo))
                        {
                            if (target != null)
                            {
                                viewModelRef = list[i];
                            }
                            list.RemoveAt(i);
                            --i;
                        }
                    }
                    if (viewModelRef == null)
                    {
                        viewModelRef = ServiceProvider.WeakReferenceFactory(viewModelTo);
                    }
                    list.Add(viewModelRef);
                }
                if (context.NavigationMode.IsClose() && viewModelFrom != null)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        var target = list[i].Target as IViewModel;
                        if (target == null || ReferenceEquals(target, viewModelFrom))
                        {
                            list.RemoveAt(i);
                            --i;
                        }
                    }
                }
            }
        }
        protected virtual void HandleOpenedViewModels(INavigationContext context)
        {
            var viewModelFrom = context.GetData(NavigationConstants.DoNotTrackViewModelFrom) ? null : context.ViewModelFrom;
            var viewModelTo   = context.GetData(NavigationConstants.DoNotTrackViewModelTo) ? null : context.ViewModelTo;

            lock (OpenedViewModels)
            {
                List <WeakOpenedViewModelInfo> list;
                if (!OpenedViewModels.TryGetValue(context.NavigationType, out list))
                {
                    list = new List <WeakOpenedViewModelInfo>();
                    OpenedViewModels[context.NavigationType] = list;
                }
                if (viewModelTo != null && (context.NavigationMode == NavigationMode.Refresh || context.NavigationMode == NavigationMode.Back || context.NavigationMode == NavigationMode.New))
                {
                    WeakOpenedViewModelInfo viewModelRef = null;
                    for (int i = 0; i < list.Count; i++)
                    {
                        var target = list[i].ViewModel;
                        if (target == null || ReferenceEquals(target, viewModelTo))
                        {
                            if (target != null)
                            {
                                viewModelRef = list[i];
                            }
                            list.RemoveAt(i);
                            --i;
                        }
                    }
                    if (viewModelRef == null)
                    {
                        viewModelRef = new WeakOpenedViewModelInfo(viewModelTo, context.NavigationProvider, context.NavigationType);
                    }
                    list.Add(viewModelRef);
                }
                if (viewModelFrom != null && context.NavigationMode.IsClose())
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        var target = list[i].ViewModel;
                        if (target == null || ReferenceEquals(target, viewModelFrom))
                        {
                            list.RemoveAt(i);
                            --i;
                        }
                    }
                }
            }
        }
 protected virtual void OnNavigatedInternal(INavigationContext context)
 {
     (context.ViewModelFrom as INavigableViewModel)?.OnNavigatedFrom(context);
     (context.ViewModelTo as INavigableViewModel)?.OnNavigatedTo(context);
     if (context.NavigationMode.IsClose() && context.ViewModelFrom != null)
     {
         OnClosed(context.ViewModelFrom, context);
         if (context.NavigationType.Operation != null && !context.GetData(NavigationConstants.SuppressNavigationCallbackOnClose))
         {
             var operationResult = OperationResult.CreateResult <object>(context.NavigationType.Operation, context.ViewModelFrom, null, context);
             CallbackManager.SetResult(operationResult);
         }
     }
 }
        private void UpdateNavigationContext(NavigationEventArgsBase args, ref INavigationContext context)
        {
            var vmType = context.GetData(ViewModelTypeConstant);

            if (vmType == null)
            {
                return;
            }

            var viewModel = GetViewModelForView(args, context.ViewModelTo, context, vmType);

            if (!ReferenceEquals(context.ViewModelTo, viewModel))
            {
                context = new NavigationContext(NavigationType.Page, context.NavigationMode, context.ViewModelFrom, viewModel, context.NavigationProvider, args.Context);
            }
        }
        private void UpdateNavigationContext(IOperationCallback callback, IViewModel navigationViewModel, NavigationEventArgsBase args, ref INavigationContext context)
        {
            var vmType = context.GetData(ViewModelTypeConstant);

            if (vmType == null)
            {
                return;
            }

            var viewModel = GetViewModelForView(args, navigationViewModel, context, vmType);

            if (!ReferenceEquals(context.ViewModelTo, viewModel))
            {
                context = new NavigationContext(NavigationType.Page, context.NavigationMode, context.ViewModelFrom, viewModel, context.NavigationProvider);
            }
            if (viewModel != null && callback != null)
            {
                RegisterOperationCallback(viewModel, callback, context);
            }
        }
        private void UpdateNavigationContext(IOperationCallback callback, IViewModel navigationViewModel, NavigationEventArgsBase args, ref INavigationContext context)
        {
            var vmType = context.GetData(ViewModelTypeConstant);
            if (vmType == null)
                return;

            var viewModel = GetViewModelForView(args, navigationViewModel, context, vmType);
            if (!ReferenceEquals(context.ViewModelTo, viewModel))
                context = new NavigationContext(NavigationType.Page, context.NavigationMode, context.ViewModelFrom, viewModel, context.NavigationProvider);
            if (viewModel != null && callback != null)
                RegisterOperationCallback(viewModel, callback, context);
        }