Exemple #1
0
        public virtual IBasePage <TPageModel> GetPageAsNewInstance <TPageModel>(TPageModel setPageModel = null) where TPageModel : class, IBasePageModel
        {
            var pageModelType = typeof(TPageModel);
            var pageType      = GetPageType(pageModelType);
            IBasePage <TPageModel> page;
            Func <object>          pageCreationFunc;

            if (_pageCreation.TryGetValue(pageModelType, out pageCreationFunc))
            {
                page = pageCreationFunc() as IBasePage <TPageModel>;
            }
            else
            {
                page = XamvvmIoC.Resolve(pageType) as IBasePage <TPageModel>;
            }

            if (setPageModel != null)
            {
                SetPageModel(page, setPageModel);
            }
            else
            {
                Func <object> pageModelCreationFunc;
                if (_pageModelCreation.TryGetValue(pageModelType, out pageModelCreationFunc))
                {
                    SetPageModel(page, pageModelCreationFunc() as TPageModel);
                }
                else
                {
                    SetPageModel(page, XamvvmIoC.Resolve <TPageModel>());
                }
            }

            return(page);
        }
Exemple #2
0
        public IBasePage <IBasePageModel> GetPageAsNewInstance(Type pageModelType)
        {
            var pageType = GetPageType(pageModelType);
            IBasePage <IBasePageModel> page;
            Func <object> pageCreationFunc;

            if (_pageCreation.TryGetValue(pageModelType, out pageCreationFunc))
            {
                page = pageCreationFunc() as IBasePage <IBasePageModel>;
            }
            else
            {
                page = XamvvmIoC.Resolve(pageType) as IBasePage <IBasePageModel>;
            }

            Func <object> pageModelCreationFunc;

            if (_pageModelCreation.TryGetValue(pageModelType, out pageModelCreationFunc))
            {
                SetPageModel(page, pageModelCreationFunc() as IBasePageModel);
            }
            else
            {
                SetPageModel(page, XamvvmIoC.Resolve(pageModelType) as IBasePageModel);
            }

            return(page);
        }
Exemple #3
0
        public IBasePage <IBasePageModel> GetPageAsNewInstance(Type pageModelType)
        {
            IBasePage <IBasePageModel> page;
            Func <object> pageCreationFunc;

            if (_pageCreation.TryGetValue(pageModelType, out pageCreationFunc))
            {
                page = pageCreationFunc() as IBasePage <IBasePageModel>;
            }
            else
            {
                var    pageType        = typeof(MockPage <>);
                Type[] typeArgs        = { pageModelType };
                var    pageGenericType = pageType.MakeGenericType(typeArgs);
                page = XamvvmIoC.Resolve(pageGenericType) as IBasePage <IBasePageModel>;
            }

            Func <object> pageModelCreationFunc;

            if (_pageModelCreation.TryGetValue(pageModelType, out pageModelCreationFunc))
            {
                SetPageModel(page, pageModelCreationFunc() as IBasePageModel);
            }
            else
            {
                SetPageModel(page, XamvvmIoC.Resolve(pageModelType) as IBasePageModel);
            }

            return(page);
        }
Exemple #4
0
        protected virtual View CreateView(Type modelType)
        {
            var  viewType = ((XamvvmFormsFactory)XamvvmCore.CurrentFactory).GetViewType(modelType);
            View view     = XamvvmIoC.Resolve(viewType) as View;

            view.BindingContext = XamvvmIoC.Resolve(modelType);

            return(view);
        }
        /// <summary>
        /// Used to register the initial navigation page model
        /// </summary>
        /// <typeparam name="TNavPageModel">Page Model for the navigation page</typeparam>
        /// <param name="initialPage">Page Model for the initial page to navigate to</param>
        /// <param name="createNavModel">TBD, defaults to null</param>
        /// <param name="createNav">TBD, defaults to null</param>
        public virtual void RegisterNavigationPage <TNavPageModel>(Func <IBasePage <IBasePageModel> > initialPage = null,
                                                                   Func <TNavPageModel> createNavModel            = null,
                                                                   Func <IBasePage <IBasePageModel>, IBasePage <TNavPageModel> > createNav = null) where TNavPageModel : class, IBasePageModel
        {
            // This defaults to null, when is it used?
            if (createNavModel != null)
            {
                Func <object> found = null;
                if (_pageModelCreation.TryGetValue(typeof(TNavPageModel), out found))
                {
                    _pageModelCreation[typeof(TNavPageModel)] = createNavModel;
                }
                else
                {
                    _pageModelCreation.Add(typeof(TNavPageModel), createNavModel);
                }
            }

            // This defaults to null, when is it used?
            if (createNav == null)
            {
                var pageModelType = typeof(TNavPageModel);
                var pageType      = GetPageType(pageModelType);

                if (initialPage == null)
                {
                    createNav = new Func <IBasePage <IBasePageModel>, IBasePage <TNavPageModel> >(
                        (page) => pageType == null ?
                        new BaseNavigationPage <TNavPageModel>() : XamvvmIoC.Resolve(pageType) as IBasePage <TNavPageModel>);
                }
                else
                {
                    createNav = new Func <IBasePage <IBasePageModel>, IBasePage <TNavPageModel> >(
                        (page) => pageType == null ?
                        new BaseNavigationPage <TNavPageModel>((Page)page) : Activator.CreateInstance(pageType, page) as IBasePage <TNavPageModel>);
                }
            }

            // this creates a new lambda function that will be later invoked
            var createNavWithPage = new Func <IBasePage <TNavPageModel> >(() =>
            {
                // Take the initial page and invoke it. The page is passed in as a lambda expression that returns something of type IBasePage<T>
                var page = initialPage?.Invoke();
                return(createNav(page));
            });

            Func <object> foundPageCreation = null;

            if (_pageCreation.TryGetValue(typeof(TNavPageModel), out foundPageCreation))
            {
                _pageCreation[typeof(TNavPageModel)] = createNavWithPage;
            }
            else
            {
                _pageCreation.Add(typeof(TNavPageModel), createNavWithPage);
            }
        }
Exemple #6
0
        public virtual IBasePage <TPageModel> GetPageAsNewInstance <TPageModel>(TPageModel setPageModel = null) where TPageModel : class, IBasePageModel
        {
            var pageModelType = typeof(TPageModel);
            var pageType      = GetPageType(pageModelType);

            IBasePage <TPageModel> page;
            Func <object>          pageCreationFunc;

            _pageCreation.TryGetValue(pageModelType, out pageCreationFunc);

            // first check if we have a registered PageCreation method for this pageModelType
            if (pageCreationFunc != null)
            {
                page = pageCreationFunc() as IBasePage <TPageModel>;
            }
            else
            {
                // if not check if it failed because there was no registered PageType
                // we cannot check this earlier because for NavgationPages we allow PageModels of the NavigationPage not having a custom NavigationPage type
                // in this case we register a default creation method, but we won't register a pageType
                // !!!!!!!!! Not sure if this is the correct way to do it
                if (pageType == null)
                {
                    throw new NoPageForPageModelRegisteredException("No PageType Registered for PageModel type: " + pageModelType);
                }
                page = XamvvmIoC.Resolve(pageType) as IBasePage <TPageModel>;

                if (page == null)
                {
                    throw new NoPageForPageModelRegisteredException("PageType not registered in IOC: " + pageType);
                }
            }

            if (setPageModel != null)
            {
                SetPageModel(page, setPageModel);
            }
            else
            {
                Func <object> pageModelCreationFunc;
                if (_pageModelCreation.TryGetValue(pageModelType, out pageModelCreationFunc))
                {
                    SetPageModel(page, pageModelCreationFunc() as TPageModel);
                }
                else
                {
                    SetPageModel(page, XamvvmIoC.Resolve <TPageModel>());
                }
            }

            return(page);
        }
Exemple #7
0
        public virtual void RegisterMasterDetail <TPageModel>(Func <IBasePage <IBasePageModel> > createMasterPage, Func <IBasePage <IBasePageModel> > createDetailPage, Func <TPageModel> createMasDetModel = null, Func <IBasePage <IBasePageModel>, IBasePage <IBasePageModel>, IBasePage <TPageModel> > createMasDet = null) where TPageModel : class, IBasePageModel
        {
            if (createMasDetModel != null)
            {
                Func <object> found = null;
                if (_pageModelCreation.TryGetValue(typeof(TPageModel), out found))
                {
                    _pageModelCreation[typeof(TPageModel)] = createMasDetModel;
                }
                else
                {
                    _pageModelCreation.Add(typeof(TPageModel), createMasDetModel);
                }
            }

            if (createMasDet == null)
            {
                var pageModelType = typeof(TPageModel);
                var pageType      = GetPageType(pageModelType) ?? typeof(BaseMasterDetailPage <TPageModel>);
                _pageModelTypes[pageModelType] = pageType;

                createMasDet = new Func <IBasePage <IBasePageModel>, IBasePage <IBasePageModel>, IBasePage <TPageModel> >(
                    (master, detail) =>
                {
                    var masdetPage       = XamvvmIoC.Resolve(pageType) as IBasePage <TPageModel>;
                    var masdetPageXam    = (MasterDetailPage)masdetPage;
                    masdetPageXam.Master = master as Page;
                    masdetPageXam.Detail = detail as Page;
                    return(masdetPage);
                });
            }

            var createMasDetWithPages = new Func <IBasePage <TPageModel> >(() =>
            {
                var masterPage = createMasterPage?.Invoke();
                var detailPage = createDetailPage?.Invoke();
                return(createMasDet(masterPage, detailPage));
            });

            Func <object> foundPageCreation = null;

            if (_pageCreation.TryGetValue(typeof(TPageModel), out foundPageCreation))
            {
                _pageCreation[typeof(TPageModel)] = createMasDetWithPages;
            }
            else
            {
                _pageCreation.Add(typeof(TPageModel), createMasDetWithPages);
            }
        }
Exemple #8
0
        public virtual void RegisterMultiPage <TContainerPageModel, TFormsContainerPageType, TFormsSubPageType>(
            Func <IEnumerable <IBasePage <IBasePageModel> > > createSubPages,
            Func <TContainerPageModel> createMultModel = null,
            Func <IEnumerable <IBasePage <IBasePageModel> >, IBasePage <TContainerPageModel> > createMult = null)
            where TContainerPageModel : class, IBasePageModel
            where TFormsContainerPageType : MultiPage <TFormsSubPageType>, new()
            where TFormsSubPageType : Page
        {
            if (createMultModel != null)
            {
                Func <object> found = null;
                if (_pageModelCreation.TryGetValue(typeof(TContainerPageModel), out found))
                {
                    _pageModelCreation[typeof(TContainerPageModel)] = createMultModel;
                }
                else
                {
                    _pageModelCreation.Add(typeof(TContainerPageModel), createMultModel);
                }
            }

            if (createMult == null)
            {
                var pageModelType = typeof(TContainerPageModel);
                var pageType      = GetPageType(pageModelType) ?? typeof(TFormsContainerPageType);
                _pageModelTypes[pageModelType] = pageType;

                if (createSubPages == null)
                {
                    createMult = new Func <IEnumerable <IBasePage <IBasePageModel> >, IBasePage <TContainerPageModel> >(
                        (pages) => XamvvmIoC.Resolve(pageType) as IBasePage <TContainerPageModel>);
                }
                else
                {
                    createMult = new Func <IEnumerable <IBasePage <IBasePageModel> >, IBasePage <TContainerPageModel> >(
                        (pages) =>
                    {
                        var multiPage    = XamvvmIoC.Resolve(pageType) as IBasePage <TContainerPageModel>;
                        var multiPageXam = (TabbedPage)multiPage;

                        foreach (var page in pages)
                        {
                            multiPageXam.Children.Add((Page)page);
                        }

                        return(multiPage);
                    });
                }
            }

            var createMultWithPages = new Func <IBasePage <TContainerPageModel> >(() =>
            {
                var pages = createSubPages?.Invoke();
                return(createMult(pages));
            });

            Func <object> foundPageCreation = null;

            if (_pageCreation.TryGetValue(typeof(TContainerPageModel), out foundPageCreation))
            {
                _pageCreation[typeof(TContainerPageModel)] = createMultWithPages;
            }
            else
            {
                _pageCreation.Add(typeof(TContainerPageModel), createMultWithPages);
            }
        }
Exemple #9
0
        /// <summary>
        /// Used to register the initial navigation page model
        /// </summary>
        /// <typeparam name="TNavPageModel">Page Model for the navigation page</typeparam>
        /// <param name="initialPage">Page Model for the initial page to navigate to</param>
        /// <param name="createNavModel">TBD, defaults to null</param>
        /// <param name="createNav">TBD, defaults to null</param>
        public virtual void RegisterNavigationPage <TNavPageModel>(Func <IBasePage <IBasePageModel> > initialPage = null,
                                                                   Func <TNavPageModel> createNavModel            = null,
                                                                   Func <IBasePage <IBasePageModel>, IBasePage <TNavPageModel> > createNav = null) where TNavPageModel : class, IBasePageModel
        {
            // This defaults to null, when is it used?
            if (createNavModel != null)
            {
                Func <object> found = null;
                if (_pageModelCreation.TryGetValue(typeof(TNavPageModel), out found))
                {
                    _pageModelCreation[typeof(TNavPageModel)] = createNavModel;
                }
                else
                {
                    _pageModelCreation.Add(typeof(TNavPageModel), createNavModel);
                }
            }

            // This defaults to null, when is it used?
            if (createNav == null)
            {
                var pageModelType = typeof(TNavPageModel);
                var pageType      = GetPageType(pageModelType) ?? typeof(BaseNavigationPage <TNavPageModel>);
                _pageModelTypes[pageModelType] = pageType;

                if (initialPage == null)
                {
                    createNav = new Func <IBasePage <IBasePageModel>, IBasePage <TNavPageModel> >(
                        (page) => XamvvmIoC.Resolve(pageType) as IBasePage <TNavPageModel>);
                }
                else
                {
                    try
                    {
                        createNav = new Func <IBasePage <IBasePageModel>, IBasePage <TNavPageModel> >(
                            (page) => Activator.CreateInstance(pageType, page) as IBasePage <TNavPageModel>);
                    }
                    catch (MissingMemberException)
                    {
                        throw new MissingMemberException(pageType + " is missing a constructor that accepts a child page as parameter");
                    }
                }
            }

            // this creates a new lambda function that will be later invoked
            var createNavWithPage = new Func <IBasePage <TNavPageModel> >(() =>
            {
                // Take the initial page and invoke it. The page is passed in as a lambda expression that returns something of type IBasePage<T>
                var page = initialPage?.Invoke();
                return(createNav(page));
            });

            Func <object> foundPageCreation = null;

            if (_pageCreation.TryGetValue(typeof(TNavPageModel), out foundPageCreation))
            {
                _pageCreation[typeof(TNavPageModel)] = createNavWithPage;
            }
            else
            {
                _pageCreation.Add(typeof(TNavPageModel), createNavWithPage);
            }
        }
Exemple #10
0
 public ViewNavigation()
 {
     BindingContext = XamvvmIoC.Resolve <TViewNavigationPageModel>();
     XamvvmIoC.RegisterSingleton <IViewNavigation <TViewNavigationPageModel> >(this);
 }