【问题标题】:Prism for Xamarin.Forms: I cannot resolve the navigationService unless if ViewModelLocator.AutowireViewModel="True"Xamarin.Forms 的棱镜:我无法解析 navigationService,除非 ViewModelLocator.AutowireViewModel="True"
【发布时间】:2016-09-11 08:54:18
【问题描述】:

卡了好几天...然后我发现问题出在哪里

我有两页,一页用于平板电脑,另一页用于手机。由于它们具有不同的名称,因此使用 ViewModelLocator.AutowireViewModel 作为绑定上下文共享相同的视图模型不起作用。因此,对于这种情况,我使用的是经典绑定上下文,因为我不想为每个页面创建一个视图模型副本。 我的问题是,当我运行它时,它给了我一个错误,说“没有为此对象棱镜定义无参数构造函数”。这个错误的原因是 viewModel 有一个需要一个导航服务的构造函数。 为了解决这个错误,我必须删除导航服务作为参数,但是我需要它,所以我可以用它导航。

【问题讨论】:

    标签: xamarin.forms prism


    【解决方案1】:

    在这种情况下,我建议使用 ViewModelLocationProvider.Register 方法。所以在应用的RegisterTypes方法中,可以放一个类似这样的条件:

    if (Device.Idiom == TargetIdiom.Tablet)
        ViewModelLocationProvider.Register("MainPage", () => your logic);
    else
        ViewModelLocationProvider.Register("MainPage", () => your logic);
    

    编辑:实际上,您仍然必须以这种方式手动解析 INavigationService。我将重新打开您的 Prism 问题。我们可以考虑改进 ViewModelocationProvider.Register 方法以启用此场景。

    【讨论】:

    • 谢谢,只是为了确认您关于拥有相同视图模型的建议,您的意思是代码片段中的“您的逻辑”,它可以返回 new MainPageViewModel() 吗?通过手动,您的意思是通过构造函数传递 INavigationService ?
    • 是的,这是您返回 ViewModel 实例的地方。问题是您仍然需要负责创建 INavigationService 并将其传递给 ctor。你可以在这里看到需要做什么github.com/PrismLibrary/Prism/blob/master/Source/Xamarin/…
    • 这就是为什么我们应该改进 ViewModelLoctor 以支持注册类型,而不仅仅是实例。我重新打开了你的问题。能否请您确认一下场景并帮我解决这个问题?
    • 我想你们已经正确地回答了我。谢谢 !你们摇滚!
    猜你喜欢
    • 2019-09-22
    • 2021-04-19
    • 2021-03-10
    • 2017-09-26
    • 2020-08-08
    • 2020-08-31
    • 1970-01-01
    • 2015-01-24
    • 2021-09-27
    相关资源
    最近更新 更多