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