You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.Mvvm NuGet包,定义消息类:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:25:26