对于xamarin形式的棱镜框架,要从一个视图导航到另一个视图,是否必须实施构造函数注入并在ViewModel的构造函数中传递INavigationService
?
我以
的身份通过INavigationService
时可以执行导航
public SomeViewModel(INavigationService navigationService)
{
_navigationService.NavigateAsync("SomeOtherPage");
}
但是当我尝试在需要时解决它时,它就不起作用
public SomeViewModel(INavigationService navigationService)
{
ContainerProvider.Resolve<T>();// ContainerProvider is IContainerProvider
}
除了在每个Viewmodel中进行构造函数注入外,还有没有其他方法可以访问INavigationService
答案 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>