Xamarin Forms Prism:是否必须在构造函数中传递INavigationService?除了构造函数注入以外的任何其他方法

时间:2018-11-14 01:58:45

标签: xamarin xamarin.forms prism

对于xamarin形式的棱镜框架,要从一个视图导航到另一个视图,是否必须实施构造函数注入并在ViewModel的构造函数中传递INavigationService

我以

的身份通过INavigationService时可以执行导航
public SomeViewModel(INavigationService navigationService)
{
  _navigationService.NavigateAsync("SomeOtherPage");
}

但是当我尝试在需要时解决它时,它就不起作用

public SomeViewModel(INavigationService navigationService)
    {
      ContainerProvider.Resolve<T>();// ContainerProvider is IContainerProvider
    }

除了在每个Viewmodel中进行构造函数注入外,还有没有其他方法可以访问INavigationService

1 个答案:

答案 0 :(得分:1)

您所描述的是一种反模式,通常只是较差的设计。由于导航服务是一项非常特殊的服务,因此它也不起作用。它是专门为每个ViewModel创建的,因为导航服务必须具有您要从其导航的Page的上下文。没有它,它仅适用于重置导航堆栈。要尝试在ViewModel中以其他任何方式解析导航服务,可能会破坏MVVM设计模式。

如果要使用导航服务,则必须通过构造函数将其注入。您也可以仅在Prism 7.1中使用XAML导航。您可以看到带有Prism Tests的示例。您还可以在此demo app中实际看到这一点。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:xaml="clr-namespace:Prism.Navigation.Xaml;assembly=Prism.Forms"
             Title="{Binding Title}"
             x:Class="Prism.DI.Forms.Tests.Mocks.Views.XamlViewMockA">
    <Button x:Name="testButton" Command="{xaml:NavigateTo 'XamlViewMockB'}">
        <Button.CommandParameter>
            <xaml:NavigationParameters>
                <xaml:NavigationParameter Key="Foo" Value="Bar"/>
            </xaml:NavigationParameters>
        </Button.CommandParameter>
    </Button>
</ContentPage>