Xamarin Forms - Prism - OnNavigedTo 调用两次

2024-02-14

因此,我已经使用 prism 开发了一个应用程序 2 个月,现在我意识到当我从 MasterDetailPage 中选择一个项目时,OnNavigedTo 方法被调用了两次。

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

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

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

从现在开始,谢谢你们,并对我的无知表示歉意。

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>();

如何从主要主详细信息 PageViewModel 调用其他页面:

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

在 App.cs 中,我开始如下,因为我首先需要登录页面:

protected override async void OnInitialized()
        {
            InitializeComponent();

            await NavigationService.NavigateAsync("LoginPage");
        }

当用户登录时,它会像这样导航:

await NavigationService.NavigateAsync("/PrincipalMasterDetailPage/PrincipalNavigationPage/WhateverPageIWantTo");

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

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

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

为了能够在应用程序启动时执行类似的操作:

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

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

我通过使用 ViewModel 注册用于导航的 NavigationPage 来修复此问题,如下所示:

    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...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin Forms - Prism - OnNavigedTo 调用两次 的相关文章

随机推荐