Using Navigation in MasterDetailPage with Autofac and Xamarin.Forms

时光总嘲笑我的痴心妄想 提交于 2019-12-06 09:30:49

Be sure not to override the PageResolver, eg. don't take the override Jonathan uses in his WeatherApp sample:

builder.RegisterInstance<Func<Page>>(() => ((NavigationPage)Application.Current.MainPage).CurrentPage);

The default implementation of the PageResolver Func in the core component takes care of MasterDetail scenarios. See AutoFacModule.cs:

            // default page resolver
            builder.RegisterInstance<Func<Page>>(() =>
            {
                // Check if we are using MasterDetailPage
                var masterDetailPage = Application.Current.MainPage as MasterDetailPage;

                var page = masterDetailPage != null 
                    ? masterDetailPage.Detail 
                    : Application.Current.MainPage;

                // Check if page is a NavigationPage
                var navigationPage = page as IPageContainer<Page>;

                return navigationPage != null 
                    ? navigationPage.CurrentPage
                        : page;
            }
        );

I have tested MasterDetail scenario with NavigationPage DetailViews succesfully with Jonathan's framework. So it should work.

In my case, the bootstrapping code is

        protected override void ConfigureApplication(IContainer container)
        {

            // set main page
            var viewFactory = container.Resolve<IViewFactory>();

            var mainPage = viewFactory.Resolve<MainPageViewModel> ();
            _application.MainPage = mainPage;

        }

That means, i have a MainPageView, which is a MasterDetailPage and which takes care of setting up it's child views:

    public class MainPage : MasterDetailPage
    {
        public MainPage (IViewFactory viewfactory)
        {
            Master = viewfactory.Resolve<MenuPageViewModel>();

            Detail = new NavigationPage (viewfactory.Resolve<DetailViewModel1>());

        }
    }

The MenuPageViewModel also uses IViewFactory to switch the MasterPages' Detail:

public class MenuPageViewModel : ViewModelBase
{
    IViewFactory _viewFactory;
    public MenuPageViewModel (IViewFactory viewFactory)
    {
        _viewFactory = viewFactory;

        ShowDetail1Command = new Command (ShowDetail1);
        ShowDetail2Command = new Command (ShowDetail2);
    }


    public ICommand ShowDetail1Command { get; set;}
    public void ShowDetail1() {
        var mainPage = _viewFactory.Resolve<MainPageViewModel> ();

        ((MasterDetailPage)mainPage).Detail = new NavigationPage (_viewFactory.Resolve<DetailViewModel1> ());
    }

    public ICommand ShowDetail2Command { get; set;}
    public void ShowDetail2() {
        var mainPage = _viewFactory.Resolve<MainPageViewModel> ();

        ((MasterDetailPage)mainPage).Detail = new NavigationPage (_viewFactory.Resolve<DetailViewModel2> ());
    }

}

Hope this helps.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!