UNO中NavigateViewModelAsync<>无法通过NavigationEventArgs传递数据
问题分析
你当前的代码存在两个核心问题:
- 键名笔误:在详情页获取参数时,判断的键是
SelectedLocation,但取值时用了SelectedItem,这会导致即使参数传递成功也拿不到正确数据。 - 导航方法与参数接收不匹配:使用
NavigateViewModelAsync<TViewModel>时,传递的data参数是直接传给目标ViewModel的,不会出现在页面OnNavigatedTo的NavigationEventArgs.Parameter中,这是你拿到null的根本原因。
解决方案
根据你的需求,提供两种可行方案:
方案一:保持ViewModel导航,在ViewModel中接收参数
修改LocationViewModel,通过构造函数或导航上下文获取参数:
// 构造函数接收参数的方式(需确保DI容器支持传递导航参数) public LocationViewModel(IDictionary<string, object> navigationParameters) { if (navigationParameters.TryGetValue("SelectedLocation", out var locObj)) { SelectedLocation = locObj as FoodTruckLibrary.DataModels.Location; } if (navigationParameters.TryGetValue("LocationList", out var listObj)) { // 处理LocationList逻辑 } } // 或者通过INavigator获取导航参数 public LocationViewModel(INavigator navigator) { var parameters = navigator.GetNavigationData<IDictionary<string, object>>(); if (parameters != null) { if (parameters.TryGetValue("SelectedLocation", out var locObj)) { SelectedLocation = locObj as FoodTruckLibrary.DataModels.Location; } } }
同时修正详情页代码中的笔误(如果仍保留页面逻辑的话):
// 把parameters["SelectedItem"]改为parameters["SelectedLocation"] VM.SelectedLocation = parameters["SelectedLocation"] as FoodTruckLibrary.DataModels.Location;
方案二:改用页面导航,在OnNavigatedTo中接收参数
如果更习惯在页面的OnNavigatedTo中处理参数,将主页面的导航方法改为直接导航到详情页类型:
private async Task OnEditLocation() { if (this.Navigator != null && SelectedLocation != null) { var navigationParameters = new Dictionary<string, object> { {"SelectedLocation", SelectedLocation }, {"LocationList", Locations } }; // 替换为NavigateAsync,指定详情页类型 await Navigator.NavigateAsync(typeof(LocationDetailPage), navigationParameters, CancellationToken.None); } }
此时详情页的OnNavigatedTo就能正常获取e.Parameter,同时记得修正之前的键名笔误。
内容的提问来源于stack exchange,提问作者Robotuner
相关产品推荐
相关产品推荐

