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

MAUI中如何在两个Content Page间传递数据?含回传问题

MAUI中从SettingsPage向MainPage回传参数的几种方法

你已经实现了从MainPage到SettingsPage的正向传参,下面介绍几种MAUI里反向传参的常用方式,替代Xamarin Android里的Intent传参逻辑:

方法一:通过事件回调传参

这种方式直接在SettingsPage定义事件,MainPage订阅事件,当SettingsPage需要回传参数时触发事件。

步骤1:在SettingsPage中定义事件

public partial class SettingsPage : ContentPage
{
    // 定义事件,参数类型根据你要回传的数据调整
    public event Action<string> OnLanguageChanged;

    public SettingsPage(string language)
    {
        InitializeComponent();
        // 初始化当前语言
        String Language = language;
    }

    // 假设点击返回按钮时触发回传
    private async void BackButton_Clicked(object sender, EventArgs e)
    {
        // 获取要回传的新语言值,比如从输入框或选择器获取
        string newLanguage = "zh-CN"; // 示例值

        // 触发事件,传递参数
        OnLanguageChanged?.Invoke(newLanguage);

        // 返回MainPage
        await Navigation.PopAsync();
    }
}

步骤2:在MainPage中订阅事件

修改MainPage跳转SettingsPage的代码,订阅事件:

public async void goToSettingsPage_button_Clicked(object sender, EventArgs e)
{
    string currentLanguage = "en-US"; // 当前语言示例值
    var settingsPage = new SettingsPage(currentLanguage);
    
    // 订阅事件,接收回传的参数
    settingsPage.OnLanguageChanged += (newLanguage) =>
    {
        // 在这里处理回传的语言值,比如更新MainPage的UI或保存设置
        Console.WriteLine($"收到回传的语言:{newLanguage}");
        // 示例:更新MainPage的文本
        someLabel.Text = $"当前语言:{newLanguage}";
    };

    await Navigation.PushAsync(settingsPage);
}

方法二:利用模态页面的返回值

如果是用PushModalAsync打开SettingsPage,可以通过PopModalAsync()的返回值来传递数据,这种方式更简洁。

步骤1:在SettingsPage中设置返回值

public partial class SettingsPage : ContentPage
{
    public SettingsPage(string language)
    {
        InitializeComponent();
        String Language = language;
    }

    private async void SaveAndBack_Clicked(object sender, EventArgs e)
    {
        string newLanguage = "zh-CN"; // 要回传的值
        // 设置返回结果,MAUI中可以用Navigation的Modal返回值
        await Navigation.PopModalAsync(newLanguage);
    }
}

步骤2:在MainPage中接收返回值

public async void goToSettingsPage_button_Clicked(object sender, EventArgs e)
{
    string currentLanguage = "en-US";
    var settingsPage = new SettingsPage(currentLanguage);
    
    // 打开模态页面并接收返回值
    var result = await Navigation.PushModalAsync(settingsPage);
    
    if (result is string newLanguage)
    {
        // 处理回传的语言值
        Console.WriteLine($"收到回传的语言:{newLanguage}");
        // 更新MainPage内容
    }
}

方法三:MVVM模式下使用共享ViewModel(推荐)

如果项目采用MVVM架构,可以定义一个共享的ViewModel,两个页面绑定同一个实例,这样数据可以双向同步,不需要手动传参。

步骤1:定义共享的SettingsViewModel

public class SettingsViewModel : INotifyPropertyChanged
{
    private string _selectedLanguage;
    public string SelectedLanguage
    {
        get => _selectedLanguage;
        set
        {
            _selectedLanguage = value;
            OnPropertyChanged(nameof(SelectedLanguage));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

步骤2:在MainPage中初始化ViewModel并绑定

public partial class MainPage : ContentPage
{
    private SettingsViewModel _viewModel;

    public MainPage()
    {
        InitializeComponent();
        _viewModel = new SettingsViewModel { SelectedLanguage = "en-US" };
        BindingContext = _viewModel;
    }

    public async void goToSettingsPage_button_Clicked(object sender, EventArgs e)
    {
        // 将同一个ViewModel传递给SettingsPage
        var settingsPage = new SettingsPage(_viewModel);
        await Navigation.PushAsync(settingsPage);
    }
}

步骤3:SettingsPage绑定ViewModel并修改数据

public partial class SettingsPage : ContentPage
{
    private SettingsViewModel _viewModel;

    public SettingsPage(SettingsViewModel viewModel)
    {
        InitializeComponent();
        _viewModel = viewModel;
        BindingContext = _viewModel;
    }

    private async void SaveButton_Clicked(object sender, EventArgs e)
    {
        // 这里修改ViewModel的属性,MainPage会自动同步
        _viewModel.SelectedLanguage = "zh-CN";
        await Navigation.PopAsync();
    }
}

内容的提问来源于stack exchange,提问作者Michał Schmude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:20:30