2017-04-06 88 views
0

我试图在我的ViewModel中注入INavigationService,所以我可以在页面之间导航,但我不知道如何使用参数注册ViewModel。这里是我的应用程序:如何在Xamarin.Forms中使用Prism在页面之间导航?

<prism:PrismApplication xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:prism="clr-namespace:Prism.Unity;assembly=Prism.Unity.Forms" 
      x:Class="PrismDemo.App" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      d1p1:Ignorable="d" xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"> 
    <prism:PrismApplication.Resources> 
     <ResourceDictionary> 

     </ResourceDictionary> 
    </prism:PrismApplication.Resources> 
</prism:PrismApplication> 

和...

public partial class App 
{ 
    INavigationService _navigationService; 

    public App(IPlatformInitializer initializer = null) : base(initializer) { } 

    protected override void OnInitialized() 
    { 
     InitializeComponent(); 

     _navigationService = NavigationService; 
     NavigationService.NavigateAsync("MainNavigationPage/Start"); 
    } 

    protected override void RegisterTypes() 
    { 
     Container.RegisterTypeForNavigation<MainNavigationPage>(); 
     Container.RegisterTypeForNavigation<StartPage, StartPageViewModel>("Start"); 
     Container.RegisterTypeForNavigation<MiddlePage, MiddlePageViewModel>("Middle"); 
     Container.RegisterTypeForNavigation<LastPage, LastPageViewModel>("Last"); 
    } 
} 

我如何注入到_navigationService的ViewModels?

感谢您的帮助

回答

1

你实际上并不具有直接,只要你遵循了约定{MyProjectName}.Views.{MyPage}{MyProjectName}.ViewModels.{MyPageViewModel}

要在视图模型使用INavigationService注册视图模型简单地把它添加到构造函数。请记住它是一个有名称的服务,因此它必须命名为navigationService。您可以在Samples Repo中查看几个示例。

public class MyPageViewModel 
{ 
    INavigationService _navigationService { get; } 

    public MyPageViewModel(INavigationService navigationService) 
    { 
     _navigationService = navigationService; 

     NavigateCommand = new DelegateCommand<string>(OnNavigateCommandExecuted); 
    } 

    public DelegateCommand<string> NavigateCommand { get; } 

    public async void OnNavigateCommandExecuted(string path) => 
     await _navigationService.NavigateAsync(path); 
} 
+0

感谢Dan,但是当我向视图模型中添加'INavigationService navigationService'参数时,我得到了一个异常:/ –

+0

@LouisaBickley你能否提供这个问题的回购? –

+0

对不起,我遗留了一些导致问题的代码。有用。谢谢! –

1

如果使用Prism,应该比你继承你AppPrismApplication:中

代替public partial class App应该public partial class App : PrismApplication

无需在您的App类中声明INavigationService _navigationService;,因为它已在PrismApplication中声明为NavigationService属性。

Prism使用IUnityContainer依赖注入框架,这意味着你所有,你会在容器注册:

Container.RegisterType<ISomeService, SomeServiceImplementation>(); 

Unity container will automatically inject in constructor

定义目标类的构造函数,将依赖类的具体类型作为参数。 Unity容器将实例化并注入一个实例。

PrismApplication寄存器INavigationService在一个容器中,所以,据我所知,你并不需要注册自己的实例,你可以只在视图模型和统一容器将注入的实例构造函数添加INavigationService类型的参数注册类型。重要的是,您应该给出参数的名称,因为Prism“期望”导航服务的此类参数名称。

+0

感谢您的输入。但是......你说:“如果你使用的是Prism,那么你应该从PrismApplication继承你的App,而不是公共部分类App应该是公共部分类App:PrismApplication。” - 有什么不同? –

+0

区别在于你的App类的基类 –

相关问题