.NET MAUI页面间数据传递:从LoginPage向MainPage回传数据
解决方案:基于代码隐藏的页面数据回传(无需额外NuGet)
步骤1:修正LoginPage代码
完善LoginPage逻辑,确保输入的姓名能被正确存储并在返回前完成赋值:
// 修正属性命名,符合C#规范 public string Name { get; set; } private void btnRegister_Clicked(object sender, EventArgs e) { if (!ValidateName()) return; // 验证通过后,把输入框内容赋值给Name属性 Name = txtRegistro.Text.Trim(); Navigation.PopAsync(); } private bool ValidateName() { return !string.IsNullOrWhiteSpace(txtRegistro.Text); }
步骤2:修改MainPage代码
在MainPage中等待LoginPage返回后,直接获取其Name属性值并更新界面:
string greetings = ""; async private void LogintBtn_Clicked(object sender, EventArgs e) { // 创建LoginPage实例并导航,等待页面返回 var loginPage = new LoginPage(); await Navigation.PushAsync(loginPage); // 页面返回后,读取LoginPage的Name值并更新UI if (!string.IsNullOrWhiteSpace(loginPage.Name)) { greetings = $"Hello {loginPage.Name}, and welcome!"; Greetinglbl.Text = greetings; } }
之前代码失效的原因
- MainPage里
PushAsync后立刻执行设置greetings的代码,此时LoginPage还未返回,Name变量始终是空值,界面自然不会更新。 - 你尝试的
Shell.GoToAsync传参是向前传参(从Main到Login),而需求是向后回传(从Login到Main),所以不适用当前场景。
可选方案:事件驱动(松散耦合)
如果需要更灵活的耦合方式,可以用事件实现:
LoginPage代码修改:
// 定义事件,完成输入后触发 public event EventHandler<string> NameSubmitted; private void btnRegister_Clicked(object sender, EventArgs e) { if (!ValidateName()) return; var inputName = txtRegistro.Text.Trim(); // 触发事件传递姓名 NameSubmitted?.Invoke(this, inputName); Navigation.PopAsync(); } private bool ValidateName() { return !string.IsNullOrWhiteSpace(txtRegistro.Text); }
MainPage代码修改:
string greetings = ""; async private void LogintBtn_Clicked(object sender, EventArgs e) { var loginPage = new LoginPage(); // 订阅事件 loginPage.NameSubmitted += LoginPage_NameSubmitted; await Navigation.PushAsync(loginPage); } private void LoginPage_NameSubmitted(object sender, string name) { greetings = $"Hello {name}, and welcome!"; Greetinglbl.Text = greetings; // 取消订阅避免内存泄漏 ((LoginPage)sender).NameSubmitted -= LoginPage_NameSubmitted; }
两种方案均基于.NET MAUI原生API实现,无需额外安装NuGet包。
内容的提问来源于stack exchange,提问作者Binnu
相关产品推荐
相关产品推荐

