OnNavigatingTo不会在XF Prism 7中触发

时间:2019-04-23 03:36:29

标签: c# xamarin mvvm xamarin.forms prism

我已经看过多篇关于导航和如何通过棱镜传递参数的文章。但是,更改页面时,我尝试执行的任何操作都不会使OnNavigatingTo方法启动。

我的目标是将一个简单的参数从LoginPage传递到MultifactorAuthPage。

如果我尝试在OnNavigatingTo方法中获取参数,则由于某些原因,您的应用程序将不会更改页面。它将到达断点,并停留在LoginPage上。

我目前正在将Xamarin Forms 3.6与Prism 7.1结合使用。

这是我的一些代码:

LoginPageViewModel

    public LoginPageViewModel(INavigationService navigationService, IPushNotification pushNotification)
    {
        _navigationService = navigationService;
        LoginCommand = new DelegateCommand(BeginLoginAsync);
    }
    private async void BeginLoginAsync()
    {
        await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
    }

MultifactorAuthViewModel

public class MultifactorAuthPageViewModel : ViewModelBase, INavigationAware
{
    INavigationService _navigationService;

    public MultifactorAuthPageViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    private override void OnNavigatingTo(INavigationParameters parameters)
    {

    }

    private override void OnNavigatedFrom(INavigationParameters parameters)
    {

    }

    private override void OnNavigatedTo(INavigationParameters parameters)
    {
        PhoneNumber = Convert.ToInt32(parameters["PhoneNumber"]);
    }

}

ViewModelBase

public class ViewModelBase : BindableBase, INavigationAware
{

    public ViewModelBase()
    {
    }

    public virtual void OnNavigatedFrom(INavigationParameters parameters)
    {

    }

    public virtual void OnNavigatedTo(INavigationParameters parameters)
    {

    }

    public virtual void OnNavigatingTo(INavigationParameters parameters)
    {

    }

}

我尝试过的一些资源:

https://prismlibrary.github.io/docs/xamarin-forms/navigation/passing-parameters.html https://xamgirl.com/prism-in-xamarin-forms-step-by-step-part-2/ https://github.com/PrismLibrary/Prism-Samples-Forms/tree/master/ContosoCookbook

3 个答案:

答案 0 :(得分:0)

您的alias()方法显然是异步的。因此,您还需要实例化命令以使其异步。试试这个:

BeginLoginAsync

您还需要更改public LoginPageViewModel(INavigationService navigationService, IPushNotification pushNotification) { _navigationService = navigationService; LoginCommand = new DelegateCommand(async () => await BeginLoginAsync()); } 方法以返回BeginLoginAsync而不是Task

void

那你应该没事。

编辑: 另外,如果您必须等待并且不要忘记调用基本方法,请尝试将该方法签名更改为异步:

private async Task BeginLoginAsync()
{
    await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
}

希望它能帮助您愉快地编写代码!

答案 1 :(得分:0)

原来,由于int值溢出,它无提示地失败了。沉默的例外是杀手

答案 2 :(得分:0)

这么老的问题,但是我今天正在解决一个类似的问题,而我的问题是某种无声的例外。因此,我将分享我的问题和解决方案,也许会有帮助。

就我而言,我有一个用于viewModel初始化的方法,该方法与一个命令配对以响应页面内的用户操作来进行“重新初始化”。因此,该方法在“ OnNavigateTo”内部调用,可以由命令调用以响应用户操作。但是OnNavigateTo没有开火...

当我的初始化方法收到一个int32参数时,首先我有一个委托命令,如下所示:

 public DelegateCommand<int> DoInitialization{ get; set; }

对我来说,问题在于viewModel构造函数中的命令实例化:它默默失败并且代码停止,原因是您只能将引用类型与命令一起使用,因此,我将DelegateCommand更改为:

 public DelegateCommand<int?> DoInitialization{ get; set; }

...使其可为空就足以拥有引用类型,并且问题消失了。是的,对于经验丰富的xamarin / prism程序员来说是显而易见的,但对于像我这样的新手来说则不是,因为您不会收到任何例外。

致谢。