Xamarin Forms - Prism - OnNavigatedTo 调用两次

所以,我已经用棱镜开发了 2 个月的应用程序,现在我意识到当我从 MasterDetailPage 中选择一个项目时,OnNavigatedTo 方法被调用了两次。


我不知道为什么会发生这种情况,我确定我遗漏了一些东西,但我大约需要两天时间来解决它。


我会在这里放一些代码,如果你们需要更多信息,我可以发布更详细的信息。


观察:当我在页面“A”中并在主从项目列表中选择页面“A”时,OnNavigatedTo 仅被调用一次,但是当我在页面“B”中并选择页面“ A", OnNavigatedTo 被调用两次。


从现在开始,谢谢你们,并为无知感到抱歉。


MasterDetailPage MVVM:


public class PrincipalMasterDetailPageViewModel : ViewModelBase {

        public ObservableCollection<PrincipalMasterPageItem> MenuItems { get; set; }


        public PrincipalMasterDetailPageViewModel(INavigationService navigationService) : base(navigationService)

        {

            MenuItems = new ObservableCollection<PrincipalMasterPageItem>();

        }

        public async override void OnNavigatedTo(NavigationParameters parameters) {

            base.OnNavigatedTo(parameters);

            .. Here I'm calling an API, thats why I have the async

        }

    }

自定义导航页面 MVVM:


public class PrincipalNavigationPageViewModel : ViewModelBase {

        public PrincipalNavigationPageViewModel(INavigationService navigationService) : base(navigationService) {

        }

    }

当我在 masterdetailpage 项目列表中选择一个项目时,我实际显示的页面:


public class NewPageTestViewModel : ViewModelBase

    {

        public NewPageTestViewModel(INavigationService navigationService) : base(navigationService)

        {


        }


        public override void OnNavigatedTo(NavigationParameters parameters)

        {

            base.OnNavigatedTo(parameters);

            Debug.WriteLine("Calling twice HERE!");

        }

    }

这三个例子的RegisterTypes:


    containerRegistry.RegisterForNavigation<PrincipalMasterDetailPage>();

containerRegistry.RegisterForNavigation<PrincipalNavigationPage>();

containerRegistry.RegisterForNavigation<NewPageTest>();

如何从 PrincipalMasterDetailPageViewModel 调用其他页面:


NavigationService.NavigateAsync(string.Format("PrincipalNavigationPage/{0}", item.TargetPageName));



梦里花落0921
浏览 245回答 2
2回答

至尊宝的传说

我不知道是否有人仍然对此感兴趣,但我遇到了同样的问题并弄清楚了发生了什么。我发现的所有代码示例都注册了一个 NavigationPage,如下所示:containerRegistry.RegisterForNavigation<NavigationPage>("Navigation");为了能够在应用启动时做这样的事情:&nbsp;NavigationService.NavigateAsync($"Main/Navigation/Home");然而,问题似乎是当这个 NavigationPage 在没有特定的 ViewModel 被实例化时,“INavigationAware”事件以某种方式传播到 MasterDetailPage 的 ViewModel 导致该事件被调用两次。我通过使用 ViewModel 注册 NavigationPage for Navigation 来修复它,如下所示:&nbsp; &nbsp; containerRegistry.RegisterForNavigation<NavigationPage, NavigationPageViewModel>("Navigation");ViewModel 本身没什么特别的:using Prism.Commands;using Prism.Mvvm;using Prism.Navigation;using System;using System.Collections.Generic;using System.Linq;using Unity.Attributes;namespace SocialRecipe.ViewModels{&nbsp; &nbsp; public class NavigationPageViewModel : ViewModelBase&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public NavigationPageViewModel()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public override void OnNavigatedFrom(INavigationParameters parameters)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public override void OnNavigatedTo(INavigationParameters parameters)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public override void OnNavigatingTo(INavigationParameters parameters)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}这样 NavigationPage 的事件被路由到 NavigationPageViewModel 并且不再传播到 MasterDetailPage…
打开App,查看更多内容
随时随地看视频慕课网APP