【问题标题】:How to navigate between pages using Prism in Xamarin.Forms?如何在 Xamarin.Forms 中使用 Prism 在页面之间导航?
【发布时间】:2017-08-31 22:55:50
【问题描述】:

我正在尝试将INavigationService 注入我的 ViewModel,以便我可以在页面之间导航,但我不知道如何使用参数注册 ViewModel。这是我的应用程序:

<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 注入 ViewModel?

感谢您的帮助

【问题讨论】:

    标签: c# xamarin xamarin.ios xamarin.forms prism


    【解决方案1】:

    您实际上不必直接注册 ViewModel,只要您遵循约定 {MyProjectName}.Views.{MyPage} 和 {MyProjectName}.ViewModels.{MyPageViewModel}

    要在 ViewModel 中使用 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);
    }
    

    【讨论】:

    • 感谢 Dan,但是当我将 INavigationService navigationService 参数添加到视图模型时出现异常:/
    • @LouisaBickley 你能提供这个问题的回购吗?
    • 对不起,我留下了一些导致问题的代码。有用。谢谢!
    【解决方案2】:

    如果你使用Prism,那么你应该从PrismApplication继承你的App:

    应该是public partial class App : PrismApplication,而不是public partial class App。

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

    Prism 使用IUnityContainer 作为依赖注入框架,这意味着你将在容器中注册:

    Container.RegisterType<ISomeService, SomeServiceImplementation>();
    

    Unity container will automatically inject in constructor:

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

    PrismApplication 在容器中注册 INavigationService,因此,据我了解,您不需要注册自己的实例,您只需在视图模型的构造函数中添加 INavigationService 类型的参数,统一容器将注入注册类型的实例。重要的是,您应该为您的参数提供一个准确的 navigationService 名称,因为Prism“期望”这样的参数名称用于导航服务。

    【讨论】:

    • 感谢您的意见。但是......您说:“如果您使用的是 Prism,那么您应该从 PrismApplication 继承您的 App,而不是公共部分类 App 应该是公共部分类 App:PrismApplication。” - 有什么区别?
    • 区别在于App 类的基类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2019-07-14
    • 2020-05-24
    • 1970-01-01
    • 2017-10-06
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多