c# - 将 MasterDetailPage 中的导航与 Autofac 和 Xamarin.Forms 一起使用

标签 c# xamarin.ios autofac xamarin.forms

我正在尝试在 Xamarin.Forms 项目中使用 Autofac。我成功创建了基本示例,甚至使用 ViewFactory 来创建一些更复杂的示例。

但是,我无法使用 MasterDetailPage 与导航一起

我正在使用 Jonathan Yates 编写的工厂和服务。你可以找到他的代码 here

我的应用程序 Bootstrap :

protected override void ConfigureApplication(IContainer container)
{
    var viewFactory = container.Resolve<IViewFactory>();
    var mainPage = viewFactory.Resolve<TestViewModel1>();

    var navigationPage = new NavigationPage(mainPage);
    var masterPage = new ContentPage();
    masterPage.Title = "asd";
    _application.MainPage = new MasterDetailPage()
    {
        Master = masterPage,
        Detail = navigationPage

    };
}

我的TestViewModel1有一个导航到 TestViewModel2 的命令:

ButtonCommand = new Command(async()=>await _navigator.PushAsync<TestViewModel2>());

但是,应用程序崩溃并显示异常

Cannot cast from source type to destination type.

Navigator 时会发生这种情况正在推送下一页。

堆栈跟踪:

" at TestIoc.TestModule+<>c.b__0_0 () [0x00000] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\TestModule.cs:27 \n at TestIoc.Views.PageProxy.get_Navigation () [0x00001] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Views\PageProxy.cs:39 \n at TestIoc.Navigator.get_Navigation () [0x00001] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Services\Navigator.cs:26 \n at TestIoc.Navigator+d__8`1[TestIoc.ViewModels.TestViewModel2].MoveNext () [0x0003a] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Services\Navigator.cs:58 "

我做错了什么?

注意:导航在没有 MasterDetailPage 时有效。

最佳答案

确保不要覆盖 PageResolver,例如。不要采用 Jonathan 在他的 WeatherApp 示例中使用的覆盖:

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

核心组件中 PageResolver Func 的默认实现负责处理 MasterDetail 场景。请参阅 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;
            }
        );

我已经使用 Jonathan 的框架成功测试了具有 NavigationPage DetailViews 的 MasterDetail 场景。所以它应该可以工作。

就我而言,引导代码是

        protected override void ConfigureApplication(IContainer container)
        {

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

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

        }

这意味着,我有一个 MainPageView,它是一个 MasterDetailPage,负责设置它的 subview :

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

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

        }
    }

MenuPageViewModel 还使用 IViewFactory 来切换 MasterPages 的详细信息:

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> ());
    }

}

希望这有帮助。

关于c# - 将 MasterDetailPage 中的导航与 Autofac 和 Xamarin.Forms 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33164175/

相关文章:

c# - 如何将 WPF 用户控件创建为 dll,然后在另一个 WPF 应用程序中查看它?

ios - 我如何直观地表明 UIAlertView 是重要的?

ios - Xamarin.iOS 未看到对 iOS 绑定(bind)库的引用

c# - Prism.Autofac.Forms 实现

c# - UPS API .Net 添加 Web 引用

c# - csc.exe 退出代码为 -2146232797 vs 2017

c# - 将 TableAdapter 与基类、接口(interface)或部分类一起使用的更智能方法

c# - 尝试制作动画时,C# 中的完成处理程序是什么样的?

dependency-injection - 如何在构建依赖项时查看消息?

c# - 找出哪个模块注册了类型