为了账号安全,请及时绑定邮箱和手机立即绑定

Xamarin Forms - Prism - OnNavigatedTo 调用两次

Xamarin Forms - Prism - OnNavigatedTo 调用两次

C#
梦里花落0921 2021-06-04 08:32:49
所以,我已经用棱镜开发了 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));
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

我不知道是否有人仍然对此感兴趣,但我遇到了同样的问题并弄清楚了发生了什么。


我发现的所有代码示例都注册了一个 NavigationPage,如下所示:


containerRegistry.RegisterForNavigation<NavigationPage>("Navigation");

为了能够在应用启动时做这样的事情:


 NavigationService.NavigateAsync($"Main/Navigation/Home");

然而,问题似乎是当这个 NavigationPage 在没有特定的 ViewModel 被实例化时,“INavigationAware”事件以某种方式传播到 MasterDetailPage 的 ViewModel 导致该事件被调用两次。


我通过使用 ViewModel 注册 NavigationPage for Navigation 来修复它,如下所示:


    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

{

    public class NavigationPageViewModel : ViewModelBase

    {

        public NavigationPageViewModel()

        {


        }


        public override void OnNavigatedFrom(INavigationParameters parameters)

        {

        }


        public override void OnNavigatedTo(INavigationParameters parameters)

        {

        }


        public override void OnNavigatingTo(INavigationParameters parameters)

        {

        }

    }

}

这样 NavigationPage 的事件被路由到 NavigationPageViewModel 并且不再传播到 MasterDetailPage…


查看完整回答
反对 回复 2021-06-05
  • 2 回答
  • 0 关注
  • 239 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信