MAUI中如何在Tab切换的页面间传递非静态Company对象?
MAUI页面间非静态Company对象共享方案
针对你的需求,这里有几种实用的实现方式,均无需将对象设为static:
1. 利用AppShell全局属性
AppShell作为应用的根容器,本身是全局可访问的实例,可直接在其中定义属性存放共享对象:
- 在
AppShell.xaml.cs中添加属性:public Company SharedCompany { get; set; } - 在MainPage初始化Company后,将对象赋值给该属性:
var myCompany = new Company(); // 初始化Company属性逻辑... ((AppShell)App.Current.MainPage).SharedCompany = myCompany; - 在AddPersonel页面中获取该对象:
var sharedCompany = ((AppShell)App.Current.MainPage).SharedCompany;
2. 依赖注入(DI)
通过MAUI内置的依赖注入容器管理Company实例,由容器负责对象生命周期,而非static:
- 在
Program.cs中注册Company实例,根据需求选择作用域:// 全局唯一实例用Singleton builder.Services.AddSingleton<Company>(); // 同作用域内共享用Scoped(按需选择) // builder.Services.AddScoped<Company>(); - 在MainPage构造函数中注入Company实例并完成初始化:
private readonly Company _sharedCompany; public MainPage(Company company) { InitializeComponent(); _sharedCompany = company; // 初始化_sharedCompany的属性... } - 在AddPersonel页面构造函数中直接注入即可使用:
private readonly Company _sharedCompany; public AddPersonel(Company company) { InitializeComponent(); _sharedCompany = company; // 使用_sharedCompany业务逻辑... }
3. 弱引用消息传递(推荐用CommunityToolkit.Mvvm)
通过消息中心传递对象,避免页面间直接引用,适合松散耦合场景:
- 安装
CommunityToolkit.MvvmNuGet包,定义消息类:public class CompanySharedMessage : CommunityToolkit.Mvvm.Messaging.MessageBase<Company> { public CompanySharedMessage(Company value) : base(value) {} } - 在MainPage初始化Company后发送消息:
var myCompany = new Company(); // 初始化逻辑... CommunityToolkit.Mvvm.Messaging.WeakReferenceMessenger.Default.Send(new CompanySharedMessage(myCompany)); - 在AddPersonel页面的构造函数或
OnAppearing方法中订阅消息:
注意:页面销毁时需取消订阅,避免内存泄漏。private Company _sharedCompany; public AddPersonel() { InitializeComponent(); CommunityToolkit.Mvvm.Messaging.WeakReferenceMessenger.Default.Register<CompanySharedMessage>(this, (recipient, message) => { _sharedCompany = message.Value; }); }
4. Tab切换事件传递
利用AppShell的Tab切换事件,在页面切换时主动传递对象:
- 在
AppShell.xaml.cs中监听CurrentItemChanged事件:public AppShell() { InitializeComponent(); CurrentItemChanged += OnCurrentItemChanged; } private void OnCurrentItemChanged(object sender, EventArgs e) { // 获取MainPage和AddPersonel实例 var mainPage = Current.Items.FirstOrDefault(item => item.Route == nameof(MainPage))?.BindingContext as MainPage; var addPersonelPage = Current.Items.FirstOrDefault(item => item.Route == nameof(AddPersonel))?.BindingContext as AddPersonel; if (mainPage?.MyCompany != null && addPersonelPage != null) { addPersonelPage.SharedCompany = mainPage.MyCompany; } } - 在MainPage中暴露初始化后的Company对象(如public属性
MyCompany),AddPersonel中定义接收用的SharedCompany属性。
内容的提问来源于stack exchange,提问作者CitrusBoy
相关产品推荐
相关产品推荐

