我的问题: 我的父页面(AdminPanel.xaml)包含一个函数:updateAllMaterialList()
这是导航堆栈上的上一页。
现在在 AddUser.xaml 页面上,我尝试通过调用 updateAllMaterialList() 来导航回来,如下所示:
private async void GoToBack(object sender, EventArgs e)
{
await Navigation.PopAsync();
NavigationPage navPage = (NavigationPage)App.Current.MainPage;
Page page = navPage.Navigation.NavigationStack[navPage.Navigation.NavigationStack.Count - 1];
((AdminPanel)page).updateAllMaterialList();
}
但是没用
首先我想指出,有充分的理由不在页面中保留业务逻辑。
我建议您检查CommunityToolkit.MVVM/MAUI。 然后添加一些服务,为您完成这项工作。 或者使用 EvenToCommandBehavior 绑定页面事件。(出现、加载等) 或者使用 Messenger 在解耦的段之间发送/接收数据。
您尝试处理逻辑和导航的方式会带来很多问题。一个页面导航应该与另一页面业务逻辑无关。
正如Jason所说,您可以在
OnAppearing
中生成AdminPanel.xaml.cs
方法重写,并将updateAllMaterialList()函数添加到OnAppearing
。因此,每当 AddUser.xaml 页面导航到 AdminPanel.xaml 页面时,它都会自动调用 updateAllMaterialList()。 OnAppearing
表示当指定页面出现时,会被调用。
是的,正如他们所说,您可以使用 OnAppearing,一切都很好。但我也发现了这样的方法:
var navPage = App.Current.MainPage;
if (navPage.Navigation != null)
{
navPage = navPage.Navigation.NavigationStack[navPage.Navigation.NavigationStack.Count - 2];
(navPage as AdminPanel).UpdateAllMaterialList();
}
您可以使用 Reflection 从 NavigatedTo 事件的 NavigatedToEventArgs 获取 PreviousPage 属性:
private void SomePage_NavigatedTo(object sender, NavigatedToEventArgs e)
{
//get e.PreviousPage internal property with Reflection
var prop = typeof(NavigatedToEventArgs).GetProperty("PreviousPage", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
//get previous page
var prev = prop.GetValue(e) as AnotherPage;
if (prev != null)
{
var value = prev.SomeValue;
}
}