从使用 Prism 的 Xamarin.Forms 应用程序中的 MVVM 设计迁移到基于 Shell 的 MAUI 应用程序(希望也是 MVVM 设计),无需 Prism。
Prism 提供 INavigationAware 接口,当页面导航到该接口时,会调用 OnNaviigationTo 方法。 OnNavigedTo 方法采用 NavgationParameters 对象,使页面之间的对象传递变得简单直观。
转向 MAUI 和 Shell,我开始意识到 QueryProperty 注释
它负责处理参数,但我仍然想念 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?
使用 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。