2015-10-07 71 views
1

我使用简单的喷油器创建IoC容器。我把这里的模式:简单的喷油器 - 注册集合

Page Navigation using MVVM in Store App

当我问到上面的帖子评论,我想注册INavigationPage的集合。我做了这样的:

private static void RegisterNavigationPages() 
{ 
     Container.RegisterCollection<INavigationPage>(new [] 
     { 
      typeof(MainNavigationPage), 
      typeof(SecondNavigationPage) 
     }); 
} 

容器我的ViewModels和的NavigationService到里面:

Container.Register<INavigationService, NavigationService>(Lifestyle.Singleton); 
Container.Register<IMainViewModel, MainViewModel>(Lifestyle.Singleton); 
Container.Register<ISecondViewModel, SecondViewModel>(Lifestyle.Singleton); 

这是这样,我怎么设置页面的DataContext:

DataContext = App.Container.GetInstance<IMainViewModel>(); 

一切都OK但我想在ViewModel构造函数中使用该集合中的NavigationPages。我可以通过索引做到这一点:

public SecondViewModel(INavigationService navigationService, IEnumerable<INavigationPage> navigationPageCollection) 
{ 
    NavigationService = navigationService; 
    _navigationPage = (navigationPageCollection.ToList())[0]; 
    GoToMainPageCommand = new Command(GoToMainPageAction); 
} 

但它并不是完美的解决方案,因为当我改变NavigationPages的顺序我将不得不改变所有索引在整个应用程序。当我能够识别哪个NavigationPage我想在ViewModel构造函数中使用时,它是否有任何解决方案?

我不能通过typeof来实现,因为NavigationPage类型在UIProject中,而且我无法从ViewModel项目中获取引用,因为存在循环引用依赖关系。

+0

所以'SecondViewModel'只需要与MainNavigationPage一起工作,还是需要更多的导航页面迭代呢? – Steven

+0

现在只有该页面,但在未来可能会需要更多的分页。几个不同的页面可以有几个按钮。它只是应用程序的骨架。目标是约10页与查看模型。 – darson1991

回答

4

目前SecondViewModel的正确性完全取决于navigationPageCollection的顺序和填充情况,这使得它非常脆弱。如果你的SecondViewModel需要MainNavigationPage,这就是你应该注入的。不要注入一个集合;注入页面本身。这可能意味着MainNavigationPage需要自己的接口,例如IMainNavigationPage。这消除了您现在正在使用的任何歧义。但是,如果不是负载一对一映射非通用接口(违反了RAP principle),则可以更好地定义few generic abstractions

+1

实际上,OP链接到一个SO问题,其中示例代码提供了一个NavigationPage 。将T从那里定义的抽象类移动到接口将解决问题。 –

+0

不是很直接,因为我不能在ViewModel中注入它,因为我不能使用页面类型,所以我不能在构造函数参数中这样做: INavigationPage mainNavigationPage。 – darson1991

0

我有一个类似的问题,并已解决此问题之前。在这里阅读我的博客 clean factory pattern

基本上你需要添加一个方法或属性来标识INavigationPage中的用户,然后在SecondViewModel中添加相同的标识符。 SecondViewModel构造函数只需遍历IEnumerable并找到它所需的页面。

相关问题