我正在将使用 Prism 的 Xamarin.Forms 应用程序迁移到 .NET Maui。该应用程序有一个 TabbedPage 导航。此迁移有效。 但是 ContentPages 包含几个 ContentView,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr-namespace:MauiDemo.Views"
x:Class="MauiDemo.Views.HomePage"
Title="HomePage">
<VerticalStackLayout>
<views:FirstContentView HeightRequest="200"/>
<views:SecondContentView HeightRequest="200"/>
</VerticalStackLayout>
</ContentPage>
在 Xamarin 中,我能够将 prism:ViewModelLocator.Autowire="true" 属性添加到 contentview 中,并且 prism 找到了关联的视图模型。在 .NET maui 中,prism:ViewModelLocator.AutowireViewModel="Automatic" 属性没有任何作用。
例如,ContentView 的名称是 “FirstContentView”。关联的viewModel的名称是“FirstContentViewViewModel”
根据https://prismlibrary.com/docs/maui/migration.html中的描述,它应该可以工作,但事实并非如此。
配置这样的自动接线有什么技巧吗?
我使用 prism 存储库的当前克隆 https://github.com/PrismLibrary/Prism 以及带有最新 MAUI 组件的当前 .NET8 SDK
我使用区域而不是通过自动装配。具有不同 ContentView 的页面应该如下所示
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr-namespace:MauiDemo.Views"
xmlns:prism="http://prismlibrary.com"
x:Class="MauiDemo.Views.HomePage"
Title="HomePage">
<VerticalStackLayout>
<ContentView prism:RegionManager.RegionName="FirstContent"/>
<ContentView prism:RegionManager.RegionName="SecondContent"/>
</VerticalStackLayout>
</ContentPage>
所需的视图及其视图模型应在 MauiProgram 中注册为 RegisterForRegionNavigation
container.RegisterForRegionNavigation<FirstContentView, FirstContentViewViewModel>();
container.RegisterForRegionNavigation<SecondContentView, SecondContentViewModel>();
.UsePrism(prism =>
{
prism.RegisterTypes(container =>
{
container.RegisterForNavigation<MainPage,MainPageViewModel>();
container.RegisterForNavigation<HomePage>();
container.RegisterForRegionNavigation<FirstContentView, FirstContentViewViewModel>();
container.RegisterForRegionNavigation<SecondContentView, SecondContentViewModel>();
})
.CreateWindow(navigationService => navigationService.CreateBuilder()
.AddSegment<MainPage>()
.NavigateAsync(HandleNavigationError));
})
包含多个ContentView的页面的ViewModel应该为所需的ContentView调用RegionManager.RequestNavigate方法。
public class HomePageViewModel : ViewModelBase, IInitialize
{
private readonly IRegionManager _regionManager;
public HomePageViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void Initialize(INavigationParameters parameters)
{
_regionManager.RequestNavigate("FirstContent", nameof(FirstContentView));
_regionManager.RequestNavigate("SecondContent", nameof(SecondContentView));
}
}
仅此而已。它的工作原理如https://xamgirl.com/prism-regions-in-xamarin-forms/
所述