public override void Close(IMvxViewModel toClose)
        {
            var root = _window.RootViewController;

            var view = Mvx.Resolve<IMvxTouchViewCreator>().CreateView(toClose) as BaseViewController;

            var masterView = MasterNavigationController.TopViewController as MasterPanelView;
            if (masterView != null && view != null)
            {
                switch (view.TypeOfView)
                {
                    case ViewType.MenuView:
                        base.Close(masterView.ViewModel);
                        break;
                    case ViewType.SubMenuView:
                        masterView.MasterContainer.HideMenu();
                        break;
                    case ViewType.DetailView:
                        base.Close(masterView.ViewModel);
                        break;
                    case ViewType.SingleView:
                        base.Close(toClose);
                        break;
                }
            }
            else
                base.Close(toClose);
        }
        public override void Close(IMvxViewModel toClose)
        {
            if (_currentModalViewController != null)
            {
                IMvxTouchView mvxTouchView = _currentModalViewController as IMvxTouchView;
                if (mvxTouchView == null)
                    MvxTrace.Error("Unable to close view - modal is showing but not an IMvxTouchView");
                else if (mvxTouchView.ReflectionGetViewModel() != toClose)
                {
                    MvxTrace.Error("Unable to close view - modal is showing but is not the requested viewmodel");
                }
                else
                {
                    // ISSUE: reference to a compiler-generated method
                    _currentModalViewController.DismissViewController(true, () => { });
                    _currentModalViewController = null;
                }

                return;
            }

            // We will look across all active navigation stacks to see if we can
            // pop our MvxView associated with this MvxViewModel (saves explicitly having to specify)
            bool modelClosed = CloseTopView(toClose, CentrePanelUiNavigationController());
            if (!modelClosed) modelClosed = CloseTopView(toClose, LeftPanelUiNavigationController());
            if (!modelClosed) modelClosed = CloseTopView(toClose, RightPanelUiNavigationController());

            if (!modelClosed)
            {
                MvxTrace.Warning("Don't know how to close this viewmodel - none of topmost views represent this viewmodel");
            }
        }
        public bool TryLoad(Type viewModelType, IDictionary<string, string> parameters, out IMvxViewModel model)
        {
            model = null;
            var constructor = viewModelType
#if NETFX_CORE
                .GetTypeInfo().DeclaredConstructors
#else
                .GetConstructors()
#endif
                .FirstOrDefault(c => c.GetParameters().All(p=> p.ParameterType == typeof(string)));

            if (constructor == null)
                return false;

            var invokeWith = new List<object>();
            foreach (var parameter in constructor.GetParameters())
            {
                string parameterValue = null;
                if (parameters == null ||
                    !parameters.TryGetValue(parameter.Name, out parameterValue))
                {
                    MvxTrace.Trace("Missing parameter in call to {0} - missing parameter {1} - asssuming null", viewModelType,
                                   parameter.Name);
                }
                invokeWith.Add(parameterValue);
            }

            model = Activator.CreateInstance(viewModelType, invokeWith.ToArray()) as IMvxViewModel;
            return (model != null);
        }
        public override void Close(IMvxViewModel toClose)
        {
            if (_currentModalViewController != null)
            {
                var touchView = _currentModalViewController as IMvxTouchView;
                if (touchView == null)
                {
                    MvxTrace.Trace(MvxTraceLevel.Error, "Unable to close view - modal is showing but not an IMvxTouchView");
                    return;
                }

                var viewModel = touchView.ReflectionGetViewModel();
                if (viewModel != toClose)
                {
                    MvxTrace.Trace(MvxTraceLevel.Error, "Unable to close view - modal is showing but is not the requested viewmodel");
                    return;
                }

                _currentModalViewController.DismissModalViewControllerAnimated(true);
                _currentModalViewController = null;
                return;
            }

            base.Close(toClose);
        }
Exemple #5
0
 public CustomDialog(Android.Content.Context context, int layout, IMvxViewModel viewModel)
     : this(context, Resource.Style.CustomDialog)
 {
     this.BindingContext = new MvxAndroidBindingContext(context, (context as IMvxLayoutInflaterHolder));
     ViewModel = viewModel;
     Init(layout);
 }
        public override void Close(IMvxViewModel toClose)
        {
            if (_currentModalViewController != null)
            {
                var touchView = _currentModalViewController as IMvxTouchView;
                if (touchView == null)
                {
                    MvxTrace.Error(
                                   "Unable to close view - modal is showing but not an IMvxTouchView");
                    return;
                }

                var viewModel = touchView.ReflectionGetViewModel();
                if (viewModel != toClose)
                {
                    MvxTrace.Error(
                                   "Unable to close view - modal is showing but is not the requested viewmodel");
                    return;
                }

                var nav = _currentModalViewController.ParentViewController as UINavigationController;
                if (nav != null)
                    nav.DismissViewController(true, () => { });
                else
                    _currentModalViewController.DismissViewController(true, () => { });
                _currentModalViewController = null;
                return;
            }

            base.Close(toClose);
        }
        public override void Close(IMvxViewModel viewModel)
        {
            if (NavigationProvider == null)
                return;

            NavigationProvider.Pop();
        }
        public virtual void Close(IMvxViewModel toClose)
        {
            var topViewController = this.MasterNavigationController.TopViewController;

            if (topViewController == null)
            {
                MvxTrace.Warning("Don't know how to close this viewmodel - no topmost");
                return;
            }

            var topView = topViewController as IMvxIosView;
            if (topView == null)
            {
                MvxTrace.Warning(
                               "Don't know how to close this viewmodel - topmost is not a touchview");
                return;
            }

            var viewModel = topView.ReflectionGetViewModel();
            if (viewModel != toClose)
            {
                MvxTrace.Warning(
                               "Don't know how to close this viewmodel - topmost view does not present this viewmodel");
                return;
            }

            this.MasterNavigationController.PopViewController(true);
        }
        public virtual void Close(IMvxViewModel toClose)
        {
            var topInterfaceController = this._interfaceControllers.Last();

            if (topInterfaceController == null)
            {
                MvxTrace.Warning("Don't know how to close this viewmodel - no topmost");
                return;
            }

            var topView = topInterfaceController as IMvxWatchOSView;
            if (topView == null)
            {
                MvxTrace.Warning(
                               "Don't know how to close this viewmodel - topmost is not a watchOSView");
                return;
            }

            var viewModel = topView.ReflectionGetViewModel();
            if (viewModel != toClose)
            {
                MvxTrace.Warning(
                               "Don't know how to close this viewmodel - topmost view does not present this viewmodel");
                return;
            }

            topInterfaceController.PopController();
        }
        public override void Close(IMvxViewModel toClose)
        {
            var topViewController = _masterNavigationController.TopViewController;

            if (topViewController == null)
            {
                MvxTrace.Trace(MvxTraceLevel.Warning, "Don't know how to close this viewmodel - no topmost");
                return;
            }

            var topView = topViewController as IMvxTouchView;
            if (topView == null)
            {
                MvxTrace.Trace(MvxTraceLevel.Warning,
                               "Don't know how to close this viewmodel - topmost is not a touchview");
                return;
            }

            var viewModel = topView.ReflectionGetViewModel();
            if (viewModel != toClose)
            {
                MvxTrace.Trace(MvxTraceLevel.Warning,
                               "Don't know how to close this viewmodel - topmost view does not present this viewmodel");
                return;
            }

            _masterNavigationController.PopViewControllerAnimated(true);
        }
 public sealed override void Close(IMvxViewModel viewModel)
 {
     if (_fragmentHostRegistrationSettings.IsTypeRegisteredAsFragment(viewModel.GetType()))
         CloseFragment(viewModel);
     else
         CloseActivity(viewModel);
 }
        public virtual IMvxViewModel Reload(IMvxViewModel viewModel,
                                   IMvxBundle parameterValues,
                                   IMvxBundle savedState)
        {
            RunViewModelLifecycle(viewModel, parameterValues, savedState);

            return viewModel;
        }
		// from Stuart Lodge N+1-25
		private UIViewController CreateViewFor(IMvxViewModel viewModel, bool navBarHidden)
		{
			var controller = new UINavigationController();
			var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
			controller.PushViewController(screen, false);
			controller.NavigationBarHidden = navBarHidden;
			return controller;
		}
 private UIViewController CreateTabFor(string title, string imageName, IMvxViewModel viewModel)
 {
     var controller = new UINavigationController();
     var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
     SetTitleAndTabBarItem(screen, title, imageName);
     controller.PushViewController(screen, false);
     return controller;
 }
    private UIViewController CreateTabFor(string title, string imageName, IMvxViewModel viewModel)
    {
        Mvx.Trace("CreateTabFor");
        var innerView = (UIViewController)this.CreateViewControllerFor(viewModel);

        PresentViewController(innerView, false, () => { });
        return innerView;
    }
Exemple #16
0
        private void AddNewTab(string title, IMvxViewModel viewModel)
        {
            var tabSpec = TabHost.NewTabSpec(title);

            tabSpec.SetIndicator(title);
            tabSpec.SetContent(this.CreateIntentFor(viewModel));

            this.TabHost.AddTab(tabSpec);
        }
 public virtual void Close(IMvxViewModel toClose)
 {
     toClose.ActOnRegisteredViews(view =>
         {
             var activity = view as Activity;
             if (activity != null)
                 activity.Finish();
         });
 }
 public override void Close(IMvxViewModel toClose)
 {
     if (ParentRootViewController.ViewControllers.Count() > 1)
         ParentRootViewController.PopViewController(true);
     else if (RootViewController.NavigationController.ViewControllers.Count() > 1)
         RootViewController.NavigationController.PopViewController(true);
     else
         base.Close(toClose);
 }
 public bool RequestClose(IMvxViewModel toClose)
 {
     Action action = () =>
                         {
                             MvxTrace.TaggedTrace("MacNavigation", "Navigate back requested");
                             _presenter.Close(toClose);
                         };
     return RequestMainThreadAction(action);
 }
 private UIViewController CreateTabFor(string title, string imageName, IMvxViewModel viewModel)
 {
     var innerView = (UIViewController)this.CreateViewControllerFor(viewModel);
     innerView.Title = title;
     innerView.TabBarItem = new UITabBarItem(
                             title, 
                             UIImage.FromBundle("Images/Tabs/" + imageName + ".png"),
                             _createdSoFarCount++);
     return innerView;
 }
 public void AddPreloadedViewModel(string viewModelType, IMvxViewModel viewModel)
 {
     if (_preloadedViewModels.ContainsKey(viewModelType)) { // replace
         // TODO: destroy old instance??
         _preloadedViewModels[viewModelType] = viewModel;
     }
     else {
         _preloadedViewModels.Add(viewModelType, viewModel);
     }
 }
        public void Bind(IMvxViewModel viewModel, IMvxBundle parameterValues = null, IMvxBundle savedState = null)
        {
            var controllerAware = viewModel as IControllerAware;
            if (controllerAware != null)
            {
                var viewModelType = viewModel.GetType();
                var name = viewModelType.FullName.Replace("ViewModel", "Controller");

                Type controllerType = GetControllerTypeForViewModel(_getCreateableTypes(), viewModel);

                if (controllerType == null)
                {
                    throw new ArgumentException(string.Format("Controller for view model {0} cannot be found.", viewModelType));
                }

                try
                {
                    var controller = (IMvxController) Mvx.IocConstruct(controllerType);
                    controllerAware.AttachController(controller);

                    var viewModelAware = controller as IViewModelAware;
                    if (viewModelAware != null)
                    {
                        viewModelAware.AttachViewModel(viewModel);
                    }

                    try
                    {
                        CallControllerInitMethods(controller, parameterValues);
                        if (savedState != null)
                        {
                            CallReloadStateMethods(controller, savedState);
                        }

                    }
                    catch (Exception ex)
                    {
                        MvxTrace.Error("MvxControllers: Problem initialising controller of type {0} - problem {1}",
                            controllerType.Name, ex.ToLongString());

                        throw;
                    }

                    controller.WaitForInitialize();
                }
                catch (Exception ex)
                {
                    MvxTrace.Error("MvxControllers: Problem creating controller of type {0} - problem {1}",
                        controllerType,
                        ex.ToLongString());

                    throw;
                }
            }
        }
	    public override void Close(IMvxViewModel viewModel)
	    {
	        if (VmPageMappings.NavigationPage == null)
	            return;

	        var page = VmPageMappings.NavigationPage.Navigation.NavigationStack.Single(p => p.BindingContext == viewModel);

            page.BindingContext = null;

            VmPageMappings.NavigationPage.Navigation.RemovePage(page);
	    }
 public virtual bool CloseChildViewModel(IMvxViewModel viewModel)
 {
     // current implementation assumes the ViewModel to close is the currently shown ViewController
     var navController = SelectedViewController as UINavigationController;
     if(navController != null)
     {
         navController.PopViewController(true);
         return true;
     }
     return false;
 }
        public IMvxViewModel GetAndClear(Bundle bundle)
        {
            var storedViewModel = _currentViewModel;
            _currentViewModel = null;

            if (bundle == null)
                return null;

            var key = bundle.GetInt(BundleCacheKey);
            var toReturn = (key == _counter) ? storedViewModel : null;
            return toReturn;
        }
        public void Cache(IMvxViewModel toCache, Bundle bundle)
        {
            _currentViewModel = toCache;
            _counter++;

            if (_currentViewModel == null)
            {
                return;
            }

            bundle.PutInt(BundleCacheKey, _counter);
        }
 public virtual bool Close(IMvxViewModel viewModel)
 {
     //Workaround for closing fragments. This will not work when showing multiple fragments of the same viewmodel type in one activity
     var frag = GetCurrentCacheableFragmentsInfo ().FirstOrDefault (x => x.ViewModelType == viewModel.GetType());
     if (frag == null)
     {
         return false;
     }
     // Close method can not be fully fixed at this moment. That requires some changes in main MvvmCross library
     CloseFragment(frag.Tag, frag.ContentId);
     return true;
 }
    private UIViewController CreateTabFor(string title, string imageName, IMvxViewModel viewModel)
    {
        Debug.Log("CreateTabFor ");
        var innerView = (UIViewController)this.CreateViewControllerFor(viewModel);

        PresentViewController(innerView, false, () => { });
        //innerView.Title = title;
        //innerView.TabBarItem = new UITabBarItem(
        //                        title, 
        //                        UIImage.FromBundle("Images/Tabs/" + imageName + ".png"),
        //                        _createdSoFarCount++);
        return innerView;
    }
        public virtual IMvxTouchView CreateView(IMvxViewModel viewModel)
        {
            var viewModelType = viewModel.GetType();
            var request = MvxShowViewModelRequest.GetDefaultRequest(viewModelType);
            var view = CreateView(request);
            var viewModelProperty = view.GetType().GetProperty("ViewModel");
            if (viewModelProperty == null)
                throw new MvxException("ViewModel Property missing for " + view.GetType());

            if (!viewModelProperty.CanWrite)
                throw new MvxException("ViewModel Property readonly for " + view.GetType());

            viewModelProperty.SetValue(view, viewModel, null);
            return view;
        }
        public override bool TryLoad(Type viewModelType, IDictionary<string, string> parameterValueLookup,
                                     out IMvxViewModel model)
        {
            model = null;
            var constructor = viewModelType
                .GetConstructors()
                .FirstOrDefault(c => c.GetParameters().All(p => IsConvertibleParameter(p)));

            if (constructor == null)
                return false;

            var invokeWith = CreateArgumentList(viewModelType, parameterValueLookup, constructor.GetParameters());
            model = Activator.CreateInstance(viewModelType, invokeWith.ToArray()) as IMvxViewModel;
            return (model != null);
        }
Exemple #31
0
        /// <summary>
        /// See if the supplied ViewModel matches up with the MvxView at the top of the supplied UINavigationController
        /// and if so, pop that View from the stack
        /// </summary>
        private bool CloseTopView(IMvxViewModel toClose, UINavigationController uiNavigationController)
        {
            if (uiNavigationController == null)
            {
                return(false);
            }

            IMvxIosView mvxTouchView = uiNavigationController.TopViewController as IMvxIosView;

            if (mvxTouchView == null)
            {
                return(false);
            }

            if (mvxTouchView.ReflectionGetViewModel() != toClose)
            {
                return(false);
            }

            uiNavigationController.PopViewController(true);

            return(true);
        }
Exemple #32
0
        protected virtual Task <bool> CloseViewPagerFragment(IMvxViewModel viewModel, MvxViewPagerFragmentPresentationAttribute attribute)
        {
            ViewPager       viewPager       = null;
            FragmentManager fragmentManager = null;

            if (attribute.FragmentHostViewType != null)
            {
                var fragment = GetFragmentByViewType(attribute.FragmentHostViewType);
                if (fragment == null)
                {
                    throw new MvxException("Fragment not found", attribute.FragmentHostViewType.Name);
                }

                viewPager       = fragment.View.FindViewById <ViewPager>(attribute.ViewPagerResourceId);
                fragmentManager = fragment.ChildFragmentManager;
            }
            else
            {
                viewPager       = CurrentActivity.FindViewById <ViewPager>(attribute.ViewPagerResourceId);
                fragmentManager = CurrentFragmentManager;
            }

            if (viewPager?.Adapter is MvxCachingFragmentStatePagerAdapter adapter)
            {
                var ft           = fragmentManager.BeginTransaction();
                var fragmentInfo = adapter.FragmentsInfo.Find(x => x.FragmentType == attribute.ViewType && x.ViewModelType == attribute.ViewModelType);
                var fragment     = fragmentManager.FindFragmentByTag(fragmentInfo.Tag);
                adapter.FragmentsInfo.Remove(fragmentInfo);
                ft.Remove(fragment);
                ft.CommitAllowingStateLoss();
                adapter.NotifyDataSetChanged();

                OnFragmentPopped(ft, fragment, attribute);
                return(Task.FromResult(true));
            }
            return(Task.FromResult(false));
        }
Exemple #33
0
        public override void Close(IMvxViewModel viewModel)
        {
            var navigationType = ((IBaseViewModel)viewModel)?.VmNavigationType ?? NavigationType.None;

            if (navigationType == NavigationType.None)
            {
                MenuNavigationController.HideMenu();
                return;
            }

            if (navigationType == NavigationType.Push)
            {
                if (MenuNavigationController.TopNavigationController.PresentedViewController != null)
                {
                    var navigationController = (MenuNavigationController.TopNavigationController.PresentedViewController as UINavigationController);
                    if (navigationController != null)
                    {
                        navigationController.PopViewController(true);
                    }
                    else
                    {
                        MenuNavigationController.TopNavigationController.PresentedViewController.DismissViewControllerAsync(true);
                    }
                }
                else
                {
                    MenuNavigationController.TopNavigationController.PopViewController(true);
                }
            }
            if (navigationType == NavigationType.PresentModal)
            {
                var controller = GetLastPresentedController(MenuNavigationController.TopNavigationController.PresentedViewController ?? MenuNavigationController.TopNavigationController.TopViewController);
                controller?.DismissViewControllerAsync(true);
            }

            ((IBaseViewModel)viewModel)?.Unbind();
        }
Exemple #34
0
        public override void Close(IMvxViewModel viewModel)
        {
            var currentWindows = Windows;

            for (int i = currentWindows.Count - 1; i >= 0; i--)
            {
                var window = currentWindows[i];

                // if toClose is a sheet or modal
                if (window.ContentViewController.PresentedViewControllers.Any())
                {
                    var modal = window.ContentViewController.PresentedViewControllers
                                .Select(v => v as MvxViewController)
                                .FirstOrDefault(v => v.ViewModel == viewModel);

                    if (modal != null)
                    {
                        window.ContentViewController.DismissViewController(modal);
                        return;
                    }
                }
                // if toClose is a tab
                var tabViewController = window.ContentViewController as IMvxTabViewController;
                if (tabViewController != null && tabViewController.CloseTabView(viewModel))
                {
                    return;
                }

                // toClose is a content
                var controller = window.ContentViewController as MvxViewController;
                if (controller != null && controller.ViewModel == viewModel)
                {
                    window.Close();
                    return;
                }
            }
        }
Exemple #35
0
        public virtual bool CloseMasterDetailPage(IMvxViewModel viewModel, MvxMasterDetailPagePresentationAttribute attribute)
        {
            var masterDetailHost = FormsApplication.MainPage as MasterDetailPage;

            if (masterDetailHost == null && FormsApplication.MainPage is MvxNavigationPage navigationPage)
            {
                masterDetailHost = navigationPage.CurrentPage as MasterDetailPage;
            }

            switch (attribute.Position)
            {
            case MasterDetailPosition.Root:
                if (FormsApplication.MainPage is MvxNavigationPage rootNavigationPage)
                {
                    rootNavigationPage.PopAsync();
                }
                break;

            case MasterDetailPosition.Master:
                if (masterDetailHost.Master is NavigationPage navigationMasterPage)
                {
                    navigationMasterPage.PopAsync();
                }
                break;

            case MasterDetailPosition.Detail:
                if (masterDetailHost.Detail is NavigationPage navigationDetailPage)
                {
                    navigationDetailPage.PopAsync();
                }
                break;

            default:
                break;
            }
            return(true);
        }
        public IMvxViewModel LoadViewModel(MvxViewModelRequest request, IMvxBundle savedState, IMvxNavigateEventArgs navigationArgs)
        {
            if (request.ViewModelType == typeof(MvxNullViewModel))
            {
                return(new MvxNullViewModel());
            }

            var viewModelLocator = FindViewModelLocator(request);

            IMvxViewModel viewModel       = null;
            var           parameterValues = new MvxBundle(request.ParameterValues);

            try
            {
                viewModel = viewModelLocator.Load(request.ViewModelType, parameterValues, savedState, navigationArgs);
            }
            catch (Exception exception)
            {
                throw exception.MvxWrap(
                          "Failed to construct and initialize ViewModel for type {0} from locator {1} - check InnerException for more information",
                          request.ViewModelType, viewModelLocator.GetType().Name);
            }
            return(viewModel);
        }
        public virtual bool TryLoad(Type viewModelType,
                                    IMvxBundle parameterValues,
                                    IMvxBundle savedState,
                                    out IMvxViewModel viewModel)
        {
            viewModel = null;

            try
            {
                viewModel = (IMvxViewModel)Mvx.IocConstruct(viewModelType);
            }
            catch (Exception exception)
            {
                MvxTrace.Warning("Problem creating viewModel of type {0} - problem {1}",
                                 viewModelType.Name, exception.ToLongString());
                return(false);
            }

            try
            {
                CallCustomInitMethods(viewModel, parameterValues);
                if (savedState != null)
                {
                    CallReloadStateMethods(viewModel, savedState);
                }
                viewModel.Start();
            }
            catch (Exception exception)
            {
                MvxTrace.Warning("Problem initialising viewModel of type {0} - problem {1}",
                                 viewModelType.Name, exception.ToLongString());
                return(false);
            }

            return(true);
        }
Exemple #38
0
        protected virtual bool CloseModalViewController(IMvxViewModel toClose)
        {
            if (ModalViewControllers == null || !ModalViewControllers.Any())
            {
                return(false);
            }

            // check for plain modals
            var modalToClose = ModalViewControllers.FirstOrDefault(v => v is IMvxIosView && v.GetIMvxIosView().ViewModel == toClose);

            if (modalToClose != null)
            {
                CloseModalViewController(modalToClose);
                return(true);
            }

            // check for modal navigation stacks
            UIViewController controllerToClose = null;

            foreach (var vc in ModalViewControllers.Where(v => v is UINavigationController))
            {
                var root = ((UINavigationController)vc).ViewControllers.FirstOrDefault();
                if (root != null && root.GetIMvxIosView().ViewModel == toClose)
                {
                    controllerToClose = root;
                    break;
                }
            }
            if (controllerToClose != null)
            {
                CloseModalViewController(controllerToClose);
                return(true);
            }

            return(false);
        }
        public ValueTask <IMvxViewModel> ReloadViewModel <TParameter>(IMvxViewModel <TParameter> viewModel, TParameter param, MvxViewModelRequest request, IMvxBundle?savedState, IMvxNavigateEventArgs?navigationArgs)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var viewModelLocator = FindViewModelLocator(request);

            var parameterValues = new MvxBundle(request.ParameterValues);

            try
            {
                viewModel = viewModelLocator.Reload(viewModel, param, parameterValues, savedState, navigationArgs);
            }
            catch (Exception exception)
            {
                throw exception.MvxWrap(
                          "Failed to reload a previously created created ViewModel for type {0} from locator {1} - check InnerException for more information",
                          request.ViewModelType !, viewModelLocator.GetType().Name);
            }

            return(new ValueTask <IMvxViewModel>(viewModel));
        }
Exemple #40
0
        protected void RunViewModelLifecycle(IMvxViewModel viewModel, IMvxBundle parameterValues, IMvxBundle savedState, IMvxNavigateEventArgs navigationArgs)
        {
            try
            {
                CallCustomInitMethods(viewModel, parameterValues);
                if (navigationArgs?.Cancel == true)
                {
                    return;
                }
                if (savedState != null)
                {
                    CallReloadStateMethods(viewModel, savedState);
                    if (navigationArgs?.Cancel == true)
                    {
                        return;
                    }
                }
                viewModel.Start();
                if (navigationArgs?.Cancel == true)
                {
                    return;
                }

                viewModel.Prepare();
                if (navigationArgs?.Cancel == true)
                {
                    return;
                }

                viewModel.InitializeTask = MvxNotifyTask.Create(() => viewModel.Initialize());
            }
            catch (Exception exception)
            {
                throw exception.MvxWrap("Problem running viewModel lifecycle of type {0}", viewModel.GetType().Name);
            }
        }
Exemple #41
0
        protected override bool CloseFragment(IMvxViewModel viewModel, MvxFragmentPresentationAttribute attribute)
        {
            // try to close nested fragment first
            if (attribute.FragmentHostViewType != null)
            {
                var fragmentHost = GetFragmentByViewType(attribute.FragmentHostViewType);
                if (fragmentHost != null &&
                    TryPerformCloseFragmentTransaction(fragmentHost.ChildFragmentManager, attribute))
                {
                    return(true);
                }
            }

            // Close fragment. If it isn't successful, then close the current Activity
            if (TryPerformCloseFragmentTransaction(CurrentFragmentManager, attribute))
            {
                return(true);
            }
            else
            {
                CurrentActivity.Finish();
                return(true);
            }
        }
        public override void Close(IMvxViewModel viewModel)
        {
            var currentView = this._rootFrame.Content as IMvxView;

            if (currentView == null)
            {
                Mvx.Warning("Ignoring close for viewmodel - rootframe has no current page");
                return;
            }

            if (currentView.ViewModel != viewModel)
            {
                Mvx.Warning("Ignoring close for viewmodel - rootframe's current page is not the view for the requested viewmodel");
                return;
            }

            if (!this._rootFrame.CanGoBack)
            {
                Mvx.Warning("Ignoring close for viewmodel - rootframe refuses to go back");
                return;
            }

            this._rootFrame.GoBack();
        }
Exemple #43
0
        protected virtual bool TryCloseViewControllerInsideStack(UINavigationController navigationController,
                                                                 IMvxViewModel viewModel)
        {
            var topViewController = navigationController.TopViewController.GetIMvxTvosView();

            if (topViewController != null && topViewController.ViewModel == viewModel)
            {
                navigationController.PopViewController(true);
                return(true);
            }

            var viewControllers = navigationController.ViewControllers.ToList();
            var viewController  = viewControllers.FirstOrDefault(vc => vc.GetIMvxTvosView().ViewModel == viewModel);

            if (viewController != null)
            {
                viewControllers.Remove(viewController);
                navigationController.ViewControllers = viewControllers.ToArray();

                return(true);
            }

            return(false);
        }
Exemple #44
0
        protected virtual Task <bool> CloseActivity(IMvxViewModel viewModel, MvxActivityPresentationAttribute?attribute)
        {
            var currentView = CurrentActivity as IMvxView;

            if (currentView == null)
            {
                _logger.Value?.Log(LogLevel.Warning, "Ignoring close for viewmodel - rootframe has no current page");
                return(Task.FromResult(false));
            }

            if (currentView.ViewModel != viewModel)
            {
                _logger.Value?.Log(LogLevel.Warning, "Ignoring close for viewmodel - rootframe's current page is not the view for the requested viewmodel");
                return(Task.FromResult(false));
            }

            // don't kill the dead
            if (CurrentActivity.IsActivityAlive())
            {
                CurrentActivity !.Finish();
            }

            return(Task.FromResult(true));
        }
        private async Task <bool> HandleMasterDetailRequest(Page page, IMvxViewModel viewModel)
        {
            var masterDetailPage = page as MasterDetailPage;

            if (masterDetailPage == null)
            {
                return(false);
            }

            await CleanupMasterDetailPage();

            try
            {
                MvxFormsApplication.Current.MainPage = masterDetailPage;
            }
            catch (NullReferenceException) {
                // In IOS da problemi
            }

            RootMasterDetailPage = masterDetailPage;

            page.BindingContext = viewModel;
            return(true);
        }
Exemple #46
0
        public override void Close(IMvxViewModel viewModel)
        {
            var viewFinder = Mvx.Resolve <IMvxViewsContainer>();
            var viewType   = viewFinder.GetViewType(viewModel.GetType());

            if (viewType.HasRegionAttribute())
            {
                var containerView = FindChild <Frame>(_rootFrame.UnderlyingControl, viewType.GetRegionName());

                if (containerView == null)
                {
                    throw new MvxException($"Region '{viewType.GetRegionName()}' not found in view '{viewType}'");
                }

                if (containerView.CanGoBack)
                {
                    containerView.GoBack();
                }
            }
            else
            {
                base.Close(viewModel);
            }
        }
        public override ValueTask <bool> Close(IMvxViewModel viewModel)
        {
            var currentWindows = Windows;

            foreach (var window in currentWindows.Reverse <NSWindow>())
            {
                // if toClose is a sheet or modal
                if (window?.ContentViewController.PresentedViewControllers.Any() ?? false)
                {
                    var modal = window.ContentViewController.PresentedViewControllers
                                .Select(v => v as MvxViewController)
                                .FirstOrDefault(v => v?.ViewModel == viewModel);

                    if (modal != null)
                    {
                        window.ContentViewController.DismissViewController(modal);
                        return(new ValueTask <bool>(true));
                    }
                }
                // if toClose is a tab
                var tabViewController = window?.ContentViewController as IMvxTabViewController;
                if (tabViewController != null && tabViewController.CloseTabView(viewModel))
                {
                    return(new ValueTask <bool>(true));
                }

                // toClose is a content
                var controller = window?.ContentViewController as MvxViewController;
                if (controller != null && controller.ViewModel == viewModel)
                {
                    window?.Close();
                    return(new ValueTask <bool>(true));
                }
            }
            return(new ValueTask <bool>(true));
        }
        public override async Task <bool> Close(IMvxViewModel viewModel)
        {
            // Only run this on host pages
            if (!(_rootFrame.Content is ISoundByteHost host))
            {
                return(await base.Close(viewModel));
            }

            // Get the view type
            var viewsContainer = Mvx.IoCProvider.Resolve <IMvxViewsContainer>();
            var viewType       = viewsContainer.GetViewType(viewModel.GetType());

            // Modal frame
            if (viewType.HasModalAttribute())
            {
                host.CloseModal();
                return(true);
            }

            // Standard frame
            await host.NavigateBackAsync();

            return(true);
        }
        public static IMvxBundle SaveStateBundle(this IMvxViewModel viewModel)
        {
            var toReturn = new MvxBundle();
            var methods  = viewModel.GetType()
                           .GetMethods()
                           .Where(m => m.Name == "SaveState")
                           .Where(m => m.ReturnType != typeof(void))
                           .Where(m => !m.GetParameters().Any());

            foreach (var methodInfo in methods)
            {
                // use methods like `public T SaveState()`
                var stateObject = methodInfo.Invoke(viewModel, new object[0]);
                if (stateObject != null)
                {
                    toReturn.Write(stateObject);
                }
            }

            // call the general `public void SaveState(bundle)` method too
            viewModel.SaveState(toReturn);

            return(toReturn);
        }
Exemple #50
0
        public virtual bool CloseChildViewModel(IMvxViewModel viewModel)
        {
            var navController = SelectedViewController as UINavigationController;

            if (navController != null)
            {
                navController.PopViewController(true);
                return(true);
            }

            // loop through Tabs
            var toClose = ViewControllers.Where(v => v.GetType() != typeof(MvxNavigationController))
                          .Select(v => v.GetIMvxIosView())
                          .FirstOrDefault(mvxView => mvxView.ViewModel == viewModel);

            if (toClose != null)
            {
                var newTabs = ViewControllers.Where(v => v.GetIMvxIosView() != toClose);
                ViewControllers = newTabs.ToArray();
                return(true);
            }

            return(false);
        }
        public void Test_WithReloadState()
        {
            _fixture.ClearAll();

            _fixture.Ioc.RegisterSingleton <IMvxStringToTypeParser>(new MvxStringToTypeParser());

            var testThing = new MockTestThing();

            _fixture.Ioc.RegisterSingleton <ITestThing>(testThing);

            var initBundleObject = new BundleObject
            {
                TheBool1   = false,
                TheBool2   = true,
                TheGuid1   = Guid.NewGuid(),
                TheGuid2   = new Guid(123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8),
                TheInt1    = 123,
                TheInt2    = 456,
                TheString1 = "Hello World",
                TheString2 = null
            };
            var initBundle = new MvxBundle();

            initBundle.Write(initBundleObject);

            var reloadBundleObject = new BundleObject
            {
                TheBool1   = true,
                TheBool2   = true,
                TheGuid1   = Guid.NewGuid(),
                TheGuid2   = new Guid(1123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8),
                TheInt1    = 1234,
                TheInt2    = 4567,
                TheString1 = "Foo Bar",
                TheString2 = null
            };
            var reloadBundle = new MvxBundle();

            reloadBundle.Write(reloadBundleObject);

            var           navigationService = _fixture.Ioc.Resolve <IMvxNavigationService>();
            var           toTest            = new MvxDefaultViewModelLocator(navigationService);
            var           args      = new MvxNavigateEventArgs(NavigationMode.Show);
            IMvxViewModel viewModel = toTest.Load(typeof(Test1ViewModel), initBundle, reloadBundle, args);

            Assert.NotNull(viewModel);
            var typedViewModel = (Test1ViewModel)viewModel;

            Assert.Equal(initBundle, typedViewModel.BundleInit);
            Assert.Equal(reloadBundle, typedViewModel.BundleState);
            Assert.Equal(testThing, typedViewModel.Thing);
            Assert.Equal(initBundleObject, typedViewModel.TheInitBundleSet);
            Assert.Equal(reloadBundleObject, typedViewModel.TheReloadBundleSet);
            Assert.Equal(initBundleObject.TheGuid1, typedViewModel.TheInitGuid1Set);
            Assert.Equal(initBundleObject.TheGuid2, typedViewModel.TheInitGuid2Set);
            Assert.Equal(initBundleObject.TheString1, typedViewModel.TheInitString1Set);
            Assert.Equal(reloadBundleObject.TheGuid1, typedViewModel.TheReloadGuid1Set);
            Assert.Equal(reloadBundleObject.TheGuid2, typedViewModel.TheReloadGuid2Set);
            Assert.Equal(reloadBundleObject.TheString1, typedViewModel.TheReloadString1Set);
            Assert.True(typedViewModel.StartCalled);
        }
 protected virtual void CallReloadStateMethods(IMvxViewModel viewModel, IMvxBundle savedState)
 {
     viewModel.CallBundleMethods("ReloadState", savedState);
 }
 public virtual bool Close(IMvxViewModel viewModel)
 {
     // Close method can not be fixed at this moment
     // That requires some changes in main MvvmCross library
     return(false);
 }
Exemple #54
0
 protected virtual bool CloseAnimatedRootViewController(IMvxViewModel viewModel, AnimatedRootPresentationAttribute attribute)
 {
     return(CloseRootViewController(viewModel, attribute));
 }
 protected virtual void CallCustomInitMethods(IMvxViewModel viewModel, IMvxBundle parameterValues)
 {
     viewModel.CallBundleMethods("Init", parameterValues);
 }
 protected bool Close(IMvxViewModel viewModel)
 {
     return(ChangePresentation(new MvxClosePresentationHint(viewModel)));
 }
Exemple #57
0
 public override void Close(IMvxViewModel viewModel)
 {
     FormsPagePresenter.Close(viewModel);
 }
Exemple #58
0
 public override void Close(IMvxViewModel viewModel)
 {
     GetPresentationAttributeAction(viewModel.GetType(), out MvxBasePresentationAttribute attribute).CloseAction.Invoke(viewModel, attribute);
 }
Exemple #59
0
 protected virtual bool CloseSplitView(IMvxViewModel viewModel, MvxSplitViewPresentationAttribute attribute)
 {
     return(ClosePage(viewModel, attribute));
 }
 protected virtual void CloseFragment(IMvxViewModel viewModel)
 {
     GetActualFragmentHost().Close(viewModel);
 }