使用 MVVM 设置中的参数进行 MAUI 导航

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

从使用 Prism 的 Xamarin.Forms 应用程序中的 MVVM 设计迁移到基于 Shell 的 MAUI 应用程序(希望也是 MVVM 设计),无需 Prism。

Prism 提供 INavigationAware 接口,当页面导航到该接口时,会调用 OnNaviigationTo 方法。 OnNavigedTo 方法采用 NavgationParameters 对象,使页面之间的对象传递变得简单直观。

转向 MAUI 和 Shell,我开始意识到 QueryProperty 注释

https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/shell/navigation?view=net-maui-8.0#pass-data

它负责处理参数,但我仍然想念 OnNavigedTo 方法。在这个方法中,除了解析参数之外,我们还可以做一些事情,比如后端调用来获取数据。

为了模仿 OnNavigedTo,我目前的做法是在代码隐藏中执行此操作(我使用 DI 实例化 MyPageViewModel)

public partial class MyPage : ContentPage
{
    public MyPage(MyPageViewModel viewModel) 
    {
        InitializeComponent();
        BindingContext = viewModel;
        NavigationPage.SetHasNavigationBar(this, false);
    }

    protected override void OnNavigatedTo(NavigatedToEventArgs args)
    {
        ((MyPageViewModel)BindingContext).OnNavigatedTo(args);
        base.OnNavigatedTo(args);
    }

    protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
    {
        ((MyPageViewModel)BindingContext).OnNavigatedFrom(args);
        base.OnNavigatedFrom(args);
    }
}

我必须将此代码插入到每个代码隐藏中。但是,NaviatedFromEventArgs 不包含从导航页面解析的参数。例如这个导航

await Shell.Current.GoToAsync($"{nameof(MyPage)}?TestModeKey=True", new Dictionary<string, object>
{
    ["MyKey"] = Myobject
});

回到 https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/shell/navigation?view=net-maui-8.0#pass-data 然而,人们可以实现 ApplyQueryAttributes后端调用,看起来不是这个方法的目的,也不是异步

public class MonkeyDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
    public Animal Monkey { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
        Monkey = query["Monkey"] as Animal;
        OnPropertyChanged("Monkey");
    }
    ...
} 

我的 Xamarin.Forms 应用程序中的当前设计是在加载视图时在 OnNavieratedTo 方法中加载和获取视图的数据。这可能会被重写以在导航之前获取数据,但这需要大量的测试和努力。

如何使用 MAUI 和 Shell 模仿 Prism 中的 OnNaviged?

mvvm navigation maui maui-shell
1个回答
0
投票

使用 Prism 从 Xamarin.Forms 应用程序中的 MVVM 设计迁移到 MAUI 应用程序 基于 Shell(希望也是 MVVM 设计),没有 Prism。

如何使用 MAUI 和 Shell 模仿 Prism 中的 OnNaviged?

使用Prism.Maui?它由 PrismLibrary 提供。另外,9.0.271-pre和9.0.401-pre(最新版本)确实支持.NET 8。

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