2015-10-16 69 views
2

我想在Xamarin.Forms項目中使用Autofac。我成功創建了基本樣本,甚至使用ViewFactory來處理更復雜的樣本。在MasterDetailPage中使用Autofac和Xamarin.Forms導航

但是,我無法使用MasterDetailPage以及導航

我正在使用由Jonathan Yates編寫的工廠和服務。你可以找到自己的代碼here

我的應用程序引導程序:

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

然而,隨着異常應用程序崩潰說

無法從源類型轉換爲目標類型。

這種情況發生在Navigator推送下一頁時。

堆棧跟蹤:

「在TestIoc.TestModule + <> c.b__0_0()[0x00000]在C:\用戶\ dushyantb \文件\的Visual Studio 2015 \項目\ 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在TestIoc.Navigator.get_Navigation()[0x00001]在C:\ Users \ dushyantb \ Documents \ Visual Studio 2015 \ Projects \ TestIoc \ TestIoc \ TestIoc \ Services \ Navigator.cs中:26 \ n在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時,導航工作。

+0

你能分享異常的堆棧跟蹤嗎? –

+0

我已經用堆棧跟蹤更新了這個問題。請檢查出來... –

回答

2

請務必不要覆蓋PageResolver,例如。不採取喬納森使用替代他WeatherApp樣品中:

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

的PageResolver函數功能的核心組件的默認實現需要的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; 
      } 
     ); 

我與喬納森的框架測試MasterDetail場景與NavigationPage DetailViews成功地。所以它應該工作。

在我的案例中,啓動代碼是

 protected override void ConfigureApplication(IContainer container) 
     { 

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

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

     } 

這意味着,我有一個MainPageView,這是一個MasterDetailPage和需要建立它的子視圖的護理:

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

} 

希望這可以幫助。

+0

謝謝! (()=> ((NavigationPage)Application.Current.MainPage).CurrentPage);我已經在使用'AutofacModule'中的MasterDetail場景的部分,但我也使用'builder.RegisterInstance >(()=> '在我自己的Module中,它是在'AutofacModule'之後註冊的。因此,以前的註冊從未執行,我不明白爲什麼! 只需要刪除這一條語句。 –

+0

我不是專家,但我發現你的導航很奇怪。我可能是錯的,但看起來你正在爲'Detail'設置一個新頁面,而不是導航。 –

+1

沒錯,這只是一個快速入侵。但是,您可以使用AutoFac將DetailView註冊爲.SingleInstance(),並且您將始終獲得DetailPage的相同實例。 –

相關問題