使用 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}/>
您可以根据自己的喜好创建该实例,并使用您需要的所有参数和依赖项。
我们已经成功地将标签页的子内容页连接到我们的 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}/>
您可以根据自己的喜好创建该实例,并使用您需要的所有参数和依赖项。