Xamarin.Forms使用Shell导航时如何传递完整自定义模型对象
Xamarin.Forms Shell导航传递完整模型对象解决方案
方案1:使用官方原生传参(推荐,适用于Xamarin.Forms 4.7及以上版本)
Shell的GoToAsync原生支持强类型对象传递,无需序列化转字符串,是最优实现方案:
- 第一步:修改导航代码,传入带对象的参数字典
// 替换yourModelInstance为你要传递的实际模型对象 await Shell.Current.GoToAsync("TesProject.Views.DetailView", new Dictionary<string, object> { { "PassedModel", yourModelInstance } });
- 第二步:在详情页对应的ViewModel上添加
QueryProperty特性接收参数
// 第一个参数是ViewModel内接收的属性名,第二个参数和传参时的key保持一致 [QueryProperty(nameof(DetailModel), "PassedModel")] public class DetailViewModel : INotifyPropertyChanged { private YourModelType _detailModel; // 你的模型类型属性,导航完成后会自动赋值为传递的对象 public YourModelType DetailModel { get => _detailModel; set { _detailModel = value; OnPropertyChanged(); // 可在这里触发拿到对象后的后续逻辑 } } // 省略INotifyPropertyChanged的基础实现代码 }
方案2:序列化传参(适用于低版本Xamarin.Forms)
如果你的项目Xamarin.Forms版本低于4.7,不支持原生对象传递,可以通过JSON序列化的方式实现:
- 第一步:导航前序列化模型为字符串,作为查询参数传递
using System.Text.Json; // 序列化模型 var modelJson = JsonSerializer.Serialize(yourModelInstance); // 对JSON字符串做URI转义,避免特殊字符导致路由解析错误 var escapedJson = Uri.EscapeDataString(modelJson); // 拼接参数导航 await Shell.Current.GoToAsync($"TesProject.Views.DetailView?modelJson={escapedJson}");
- 第二步:接收参数后反序列化为模型对象
[QueryProperty(nameof(ModelJson), "modelJson")] public class DetailViewModel : INotifyPropertyChanged { private string _modelJson; public string ModelJson { get => _modelJson; set { _modelJson = Uri.UnescapeDataString(value); // 反序列化得到完整模型对象 DetailModel = JsonSerializer.Deserialize<YourModelType>(_modelJson); } } public YourModelType DetailModel { get; set; } }
注意事项
- 路由注册的字符串要和导航时传入的路由完全一致,避免大小写、拼写错误导致路由匹配失败
- 若你没有使用MVVM架构,也可以在
DetailView的OnNavigatedTo生命周期方法中手动获取参数赋值
内容的提问来源于stack exchange,提问作者Mannu
相关产品推荐
相关产品推荐

