Esempio n. 1
0
        /// <summary>
        /// Register a ViewModel agains a View
        /// </summary>
        /// <param name="viewModel">The ViewModel type</param>
        /// <param name="view">The View type</param>
        public void Register(Type view, Type viewModel = null)
        {
            ViewMapAttribute map = view.GetAttribute <ViewMapAttribute>();

            if (map == null)
            {
                if (viewModel == null)
                {
                    return;
                }

                map = new ViewMapAttribute(viewModel);
            }

            map.View = view;

            _resolver.Register(view);
            _resolver.Register(map.ViewModel);

            _mappings[map.ViewModel] = map;
        }
Esempio n. 2
0
        /// <summary>
        /// Resolves a View and its related ViewModel
        /// </summary>
        /// <param name="viewModelType">The ViewModel type</param>
        /// <param name="vm">The output ViewModel instance</param>
        /// <returns>The ViewModel instance</returns>
        public Xamarin.Forms.Page Resolve(Type viewModelType, out IViewModel viewModel)
        {
            var vm = _resolver.Resolve(viewModelType) as ViewModel;

            Xamarin.Forms.Application.Current.On <iOS>().SetPanGestureRecognizerShouldRecognizeSimultaneously(true);

            Xamarin.Forms.Page view = null;
            ViewMapAttribute   map  = _mappings[viewModelType];

            if (vm == null || map == null)
            {
                throw new InvalidOperationException("View Model not mapped!");
            }

            Xamarin.Forms.Page pageView = _resolver.Resolve(map.View) as Xamarin.Forms.Page;

            if (pageView == null)
            {
                string message = string.Format("Page not mapped! View Model: {0}", viewModelType);
                throw new InvalidOperationException(message);
            }

            if (map.MenuViewModel == null)
            {
                view = pageView;
                view.On <iOS>().SetUseSafeArea(true);
            }
            else
            {
                IViewModel         menuViewModel = null;
                Xamarin.Forms.Page menuView      = Resolve(map.MenuViewModel, out menuViewModel);

                if (menuView != null)
                {
                    pageView.BindingContext = vm;
                    pageView.Parent         = null;
                    menuView.Parent         = null;

                    if (string.IsNullOrWhiteSpace(menuView.Title))
                    {
                        menuView.Title = menuView.GetType().Name;
                    }

                    if (string.IsNullOrWhiteSpace(pageView.Title))
                    {
                        pageView.Title = pageView.GetType().Name;
                    }

                    view = new MasterDetailPage
                    {
                        Master = menuView,
                        Detail = pageView
                    };

                    pageView.On <iOS>().SetUseSafeArea(true);
                }
            }

            view.Title          = vm.Title;
            view.BindingContext = vm;

            if (map.HideNavigation)
            {
                Xamarin.Forms.NavigationPage.SetHasNavigationBar(view, false);
            }

            viewModel = vm;

            return(view);
        }