.NET MAUI视图模型中调用InsertBeforePage并传递导航参数的方法
解决方案
1. 从ReportsPage直接跳转至DetailPage并传递ReportId
在ReportsPage的逻辑层(代码后台或ViewModel)中,通过Shell导航传递参数:
// 触发跳转时传入目标ReportId await Shell.Current.GoToAsync(nameof(DetailPage), new Dictionary<string, object> { { "ReportId", targetReportId } });
2. 在DetailPage的ViewModel中接收ReportId
通过QueryProperty特性绑定参数,实现ViewModel对ReportId的接收:
public class DetailViewModel : ObservableObject { [QueryProperty(nameof(ReportId), "ReportId")] public int ReportId { get; set; } // 声明弱引用存储当前页面,避免内存泄漏 public WeakReference<Page> CurrentPage { get; set; } // 执行插入导航栈的方法 public async Task InsertSummaryPageToStack() { if (CurrentPage.TryGetTarget(out var detailPage)) { // 创建带参数的SummaryPage var summaryPage = new SummaryPage(); if (summaryPage.BindingContext is SummaryViewModel summaryVm) { summaryVm.ReportId = this.ReportId; } // 插入到当前页之前 await Shell.Current.Navigation.InsertBeforePage(summaryPage, detailPage); } } }
3. 关联DetailPage与ViewModel并触发插入操作
在DetailPage的代码后台中,将页面实例传递给ViewModel,并在页面显示时执行插入逻辑:
public DetailPage() { InitializeComponent(); var vm = new DetailViewModel(); // 用弱引用传递当前页面 vm.CurrentPage = new WeakReference<Page>(this); BindingContext = vm; } protected override async void OnAppearing() { base.OnAppearing(); if (BindingContext is DetailViewModel vm) { // 避免重复插入,先检查导航栈结构 var navigationStack = Shell.Current.Navigation.NavigationStack; var currentIndex = navigationStack.IndexOf(this); if (currentIndex > 0 && navigationStack[currentIndex - 1] is not SummaryPage) { await vm.InsertSummaryPageToStack(); } } }
4. 验证效果
完成后导航栈结构为:ReportsPage => SummaryPage(带ReportId) => DetailPage。用户从DetailPage返回时会先回到SummaryPage,符合需求。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

