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

如何在MAUI中从EntryForm将导航参数传递给两个标签页?

如何将EntryForm的输入参数传递给两个标签页

针对你的MAUI Shell结构,有几种实用的方法可以实现参数传递,下面逐一说明:

方法一:共享ViewModel(MVVM模式首选)

这种方式适合需要长期同步参数的场景,通过单例ViewModel让所有页面共享数据:

  1. 创建共享ViewModel类
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace YourAppNamespace
{
    public class SharedDataViewModel : INotifyPropertyChanged
    {
        private string _inputText;
        public string InputText
        {
            get => _inputText;
            set
            {
                _inputText = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
  1. 注册单例ViewModel
    在MauiProgram.cs的CreateMauiApp方法中注入单例:
builder.Services.AddSingleton<SharedDataViewModel>();
  1. EntryForm中更新参数
    在EntryForm的代码后台注入ViewModel,按钮点击时更新属性:
private readonly SharedDataViewModel _sharedData;

public EntryForm(SharedDataViewModel sharedData)
{
    InitializeComponent();
    _sharedData = sharedData;
}

private void OnSubmitBtnClicked(object sender, EventArgs e)
{
    // 假设输入框x:Name为InputEntry
    _sharedData.InputText = InputEntry.Text;
    // 切换到标签页
    Shell.Current.GoToAsync("//Results/Page1");
}
  1. 标签页绑定接收参数
    在Page1和Page2的代码后台注入ViewModel并绑定到UI:
private readonly SharedDataViewModel _sharedData;

public Page1(SharedDataViewModel sharedData)
{
    InitializeComponent();
    _sharedData = sharedData;
    BindingContext = _sharedData;
}

然后在XAML中直接绑定属性:

<Label Text="{Binding InputText}" />

这样EntryForm提交后,两个标签页的UI会自动同步参数。

方法二:导航时直接传参

适合单次传递参数的场景,通过Shell导航路由携带参数:

  1. EntryForm按钮点击时传参
private async void OnSubmitBtnClicked(object sender, EventArgs e)
{
    var inputVal = InputEntry.Text;
    // 导航到Page1并携带参数
    await Shell.Current.GoToAsync($"//Results/Page1?Input={inputVal}");
}
  1. 标签页接收参数
    在Page1和Page2的OnNavigatedTo方法中获取参数:
protected override async void OnNavigatedTo(NavigatedToEventArgs args)
{
    base.OnNavigatedTo(args);
    if (await Shell.Current.CurrentPage.Navigation.Parameter is Dictionary<string, object> param)
    {
        if (param.TryGetValue("Input", out var inputVal))
        {
            ResultLabel.Text = inputVal.ToString();
        }
    }
}

注意:这种方式下切换到Page2时,需要重新传递参数,或者在EntryForm提交时提前处理Page2的参数初始化。

方法三:消息传递(WeakReferenceMessenger)

适合一次性通知多个页面接收参数的场景:

  1. 定义消息类
public class InputSubmittedMsg
{
    public string InputValue { get; set; }
}
  1. EntryForm发送消息
private void OnSubmitBtnClicked(object sender, EventArgs e)
{
    var inputVal = InputEntry.Text;
    WeakReferenceMessenger.Default.Send(new InputSubmittedMsg { InputValue = inputVal });
    Shell.Current.GoToAsync("//Results/Page1");
}
  1. 标签页接收消息
    在Page1和Page2的构造函数中注册消息监听:
public Page1()
{
    InitializeComponent();
    WeakReferenceMessenger.Default.Register<InputSubmittedMsg>(this, (recipient, msg) =>
    {
        // 主线程更新UI
        MainThread.BeginInvokeOnMainThread(() =>
        {
            ResultLabel.Text = msg.InputValue;
        });
    });
}

内容的提问来源于stack exchange,提问作者Costas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:52:01