Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XF Prism 7中导航到不点火_C#_Xamarin_Mvvm_Xamarin.forms_Prism - Fatal编程技术网

C# 在XF Prism 7中导航到不点火

C# 在XF Prism 7中导航到不点火,c#,xamarin,mvvm,xamarin.forms,prism,C#,Xamarin,Mvvm,Xamarin.forms,Prism,我已经阅读了多篇关于导航和使用prism传递参数的文章。但是,我尝试的任何方法都不会在更改页面时触发OnNavigationTo方法 我的目标是将一个简单的参数从LoginPage传递到MultifactorAuthPage 如果我尝试在OnNavigationTo方法中获取参数,应用程序将不会因为某些原因更改页面。它将到达断点并停留在登录页面上 我目前正在使用Xamarin Forms 3.6和Prism 7.1 以下是我的一些代码: LoginPageViewModel public

我已经阅读了多篇关于导航和使用prism传递参数的文章。但是,我尝试的任何方法都不会在更改页面时触发OnNavigationTo方法

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

如果我尝试在OnNavigationTo方法中获取参数,应用程序将不会因为某些原因更改页面。它将到达断点并停留在登录页面上

我目前正在使用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"));
    }
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"]);
    }

}
多因素AuthViewModel

    public LoginPageViewModel(INavigationService navigationService, IPushNotification pushNotification)
    {
        _navigationService = navigationService;
        LoginCommand = new DelegateCommand(BeginLoginAsync);
    }
    private async void BeginLoginAsync()
    {
        await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
    }
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)
    {

    }

}
我尝试过的一些资源:


您的
BeginLoginAsync
方法显然是异步的。因此,您还需要将命令实例化为异步的。试试这个:

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

private async Task BeginLoginAsync()
{
    await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
}
那你应该没事了

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

public override async void OnNavigatingTo(INavigationParameters parameters)
{
   ...
   base.OnNavigatingTo(parameters);
}

希望它有帮助&快乐编码

您的
BeginLoginAsync
方法显然是异步的。因此,您还需要将命令实例化为异步的。试试这个:

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

private async Task BeginLoginAsync()
{
    await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
}
那你应该没事了

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

public override async void OnNavigatingTo(INavigationParameters parameters)
{
   ...
   base.OnNavigatingTo(parameters);
}

希望它有帮助&快乐编码

结果表明,由于int值溢出,它正在悄无声息地失败。静默异常是杀手

结果表明,由于int值溢出,它是静默失败的。沉默的例外是杀手

这么老的问题,但我今天也在为一个类似的问题而斗争,我的问题是某种沉默的例外。所以我将分享我的问题和解决方案,也许会有帮助

在我的例子中,我有一个viewModel初始化方法,该方法与一个命令相结合,以执行“重新初始化”,响应页面内的用户操作。因此,该方法在“OnNavigateTo”中调用,并可由命令调用以响应用户操作。但是OnNavigateTo没有开火

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

 public DelegateCommand<int> DoInitialization{ get; set; }
public DelegateCommand DoInitialization{get;set;}
我遇到的问题是viewModel构造函数中的命令实例化:它以静默方式失败,代码停止,原因是您只能在命令中使用引用类型,因此,我将DelegateCommand更改为:

 public DelegateCommand<int?> DoInitialization{ get; set; }
public DelegateCommand DoInitialization{get;set;}
。。。使其可为null就足以拥有引用类型,问题就消失了。是的,这对于经验丰富的xamarin/prism程序员来说是显而易见的,但对于像我这样的新手来说则不然,因为您不会收到任何例外


问候。

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

在我的例子中,我有一个viewModel初始化方法,该方法与一个命令相结合,以执行“重新初始化”,响应页面内的用户操作。因此,该方法在“OnNavigateTo”中调用,并可由命令调用以响应用户操作。但是OnNavigateTo没有开火

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

 public DelegateCommand<int> DoInitialization{ get; set; }
public DelegateCommand DoInitialization{get;set;}
我遇到的问题是viewModel构造函数中的命令实例化:它以静默方式失败,代码停止,原因是您只能在命令中使用引用类型,因此,我将DelegateCommand更改为:

 public DelegateCommand<int?> DoInitialization{ get; set; }
public DelegateCommand DoInitialization{get;set;}
。。。使其可为null就足以拥有引用类型,问题就消失了。是的,这对于经验丰富的xamarin/prism程序员来说是显而易见的,但对于像我这样的新手来说则不然,因为您不会收到任何例外


问候。

不幸的是,这不起作用。它可以导航到多因素页面,但不会触发事件。奇怪的是,你错过了对base.onNavigateXXXXX(参数)的调用;在每种方法中,当应用程序加载时,LoginView模型中都会点击OnNavigationTo和OnNavigatedTo。当我尝试转到multi-factor页面时,只会点击onNavigationTo方法(而不是onNavigatedTo)。然后,如果单击导航栏中的后退箭头,则会在LoginView模型中再次单击OnNavigatedTo。因此,我的MultifactorViewModel一定出了问题。这些建议很好,但并没有真正解决这个问题。呼叫基地。导航。。。不会有任何效果,他会调用空的虚拟方法。async void方法在将委托传递到命令时也非常好,它们的行为与async事件处理程序相同,而async void是可以接受的另一种情况。不幸的是,这不起作用。它可以导航到多因素页面,但不会触发事件。奇怪的是,你错过了对base.onNavigateXXXXX(参数)的调用;在每种方法中,当应用程序加载时,LoginView模型中都会点击OnNavigationTo和OnNavigatedTo。当我尝试转到multi-factor页面时,只会点击onNavigationTo方法(而不是onNavigatedTo)。然后,如果单击导航栏中的后退箭头,则会在LoginView模型中再次单击OnNavigatedTo。因此,我的MultifactorViewModel一定出了问题。这些建议很好,但并没有真正解决这个问题。呼叫基地。导航。。。不会有任何效果,他会调用空的虚拟方法。异步void方法也非常有用