使用 Prism NavigationService 实例化标签页子视图模型时出现问题

Problem instantiating Tab page Child Viewmodel with Prism NavigationService

我们已经成功地将标签页的子内容页连接到我们的 Prism Xamarin Forms 应用程序中它自己的视图模型。如果 ContactsScreenViewModel 具有无参数构造函数,则此方法有效。如果我们将 NavigationService 注入到构造函数中,代码将无法编译。有谁知道我们如何解决这个问题?

Visual Studio 报告需要无参数构造函数

<?xml version="1.0" encoding="utf-8" ?>
     <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
            xmlns:views="clr-namespace:TabsTest.Views"
            xmlns:viewmodels="clr-namespace:TabsTest.ViewModels"
            x:Class="TabsTest.Views.MainPage"
             Title="{Binding Title}"
              UnselectedTabColor ="Gray"
            SelectedTabColor="Green"
             BarBackgroundColor="LightGray">


    <views:ContactsScreen BackgroundColor="White" Title="Contacts">
        <views:ContactsScreen.BindingContext>
            <viewmodels:ContactsScreenViewModel/>
        </views:ContactsScreen.BindingContext>
        
        <ContentPage.ToolbarItems>
            <ToolbarItem  Order="Primary"
                 Priority="1" >

            </ToolbarItem>
            <ToolbarItem  Order="Primary"
                 Priority="0" >

            </ToolbarItem>
        </ContentPage.ToolbarItems>

       </views:ContactsScreen>
    </TabbedPage>




    using Prism.Navigation;
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TabsTest.ViewModels
    {
       public class ContactsScreenViewModel
       {
        private INavigationService _navigationService { get; }

        public ContactsScreenViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;
        }
      }
    }

<viewmodels:ContactsScreenViewModel/> 是构造函数调用...您希望参数从哪里来?

您想先解析视图模型(通过工厂)然后将视图附加到它,或者使用 ViewModelLocator 为您解析视图模型(并解析并注入它的依赖项),例如 here 所述。

<TabbedPage [...] 
            xmlns:prism="http://prismlibrary.com"
            prism:ViewModelLocator.AutowireViewModel="True">

将解析 TabbedPageViewModel 的实例并将其放入 BindingContext

那个人应该通过 属性:

公开一个 ContactsScreenViewModel 的实例
<views:ContactsScreen BindingContext={Binding ThePropertyOnTabbedPageViewModel}/>

您可以根据自己的喜好创建该实例,并使用您需要的所有参数和依赖项。