棱镜:ViewModelLocator.AutowireViewModel 不适用于内容视图

问题描述 投票:0回答:1

我正在将使用 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

maui prism
1个回答
0
投票

我使用区域而不是通过自动装配。具有不同 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/

所述
© www.soinside.com 2019 - 2024. All rights reserved.