MvvmCross url 导航导航到错误的 ViewModel
MvvmCross url navigation navigates to wrong ViewModel
我正在开发一款移动应用程序,该应用程序使用 Xamarin Classis UI 和 MvvmCross 5。6.x 我们希望利用 url 基本导航向应用程序。我们希望遵循与客户网站相同的 url 方案,以便可以共享 urls 以导航到两者中的特定内容。例如,以下两个 url 应该按照描述进行导航:
http://www.rseg.net/rewards 应导航至忠诚度奖励列表
http://www.rseg.net/rewards/1234 应显示有关特定奖励的详细信息
我已经将以下两个视图模型设置为 url 的目标:
[assembly: MvxNavigation(typeof(RewardsViewModel),
@"http://www.rseg.net/rewards")]
namespace MvvmNav.Core.ViewModels
{
public class RewardsViewModel : MvxViewModel
{
…
}
}
和
[assembly: MvxNavigation(typeof(RewardDetailViewModel),
@"http://www.rseg.net/rewards/(?<id>[0-9]{4})$")]
namespace MvvmNav.Core.ViewModels
{
public class RewardDetailViewModel :
MvxViewModel<RewardDetailViewModel.Parameteres>
{
…
}
}
我已将以下两个命令添加到初始视图模型中。
public IMvxAsyncCommand ShowRewardsByUrl { get; protected set; }
protected async Task ShowRewardsByUrlHandler()
{
var url = "http://www.rseg.net/rewards";
if (await _navigationService.CanNavigate(url))
await _navigationService.Navigate(url);
}
public IMvxAsyncCommand ShowRewardDetailByUrl { get; protected set; }
protected async Task ShowRewardDetailByUrlHandler()
{
var url = "http://www.rseg.net/rewards/1234";
if (await _navigationService.CanNavigate(url))
await _navigationService.Navigate(url);
}
我看到的行为是两个命令最终都导航到 RewardsViewModel,而不是第二个命令导航到 RewwardDetailViewModel;有没有办法指定导航 urls 以便我可以实现我上面描述的行为?
整个示例可以从GitHub https://github.com/rsegtx/So.MvvmNav下载;我只完成了 Android 应用程序的视图。
提前致谢。
我认为您需要 Navigation facade 才能正常工作,并将两个 ViewModel 的路由也更改为 @"http://www.rseg.net/rewards(/(?<id>[0-9]{4}))?$"
:
[assembly: MvxRouting(typeof(SimpleNavigationFacade), @"http://www.rseg.net/rewards(/(?<id>[0-9]{4}))?$")]
namespace *.NavigationFacades
{
public class SimpleNavigationFacade
: IMvxNavigationFacade
{
public Task<MvxViewModelRequest> BuildViewModelRequest(string url,
IDictionary<string, string> currentParameters, MvxRequestedBy requestedBy)
{
var viewModelType = typeof(RewardsViewModel);
if(currentParameters.TryGetValue("id", out string paramId) && !string.IsNullOrEmpty(paramId))
viewModelType = typeof(RewardDetailViewModel);
return Task.FromResult(new MvxViewModelRequest(viewModelType, string.IsNullOrEmpty(paramId) ? new MvxBundle() : new MvxBundle(currentParameters), null));
}
}
}
高
我正在开发一款移动应用程序,该应用程序使用 Xamarin Classis UI 和 MvvmCross 5。6.x 我们希望利用 url 基本导航向应用程序。我们希望遵循与客户网站相同的 url 方案,以便可以共享 urls 以导航到两者中的特定内容。例如,以下两个 url 应该按照描述进行导航:
http://www.rseg.net/rewards 应导航至忠诚度奖励列表 http://www.rseg.net/rewards/1234 应显示有关特定奖励的详细信息
我已经将以下两个视图模型设置为 url 的目标:
[assembly: MvxNavigation(typeof(RewardsViewModel),
@"http://www.rseg.net/rewards")]
namespace MvvmNav.Core.ViewModels
{
public class RewardsViewModel : MvxViewModel
{
…
}
}
和
[assembly: MvxNavigation(typeof(RewardDetailViewModel),
@"http://www.rseg.net/rewards/(?<id>[0-9]{4})$")]
namespace MvvmNav.Core.ViewModels
{
public class RewardDetailViewModel :
MvxViewModel<RewardDetailViewModel.Parameteres>
{
…
}
}
我已将以下两个命令添加到初始视图模型中。
public IMvxAsyncCommand ShowRewardsByUrl { get; protected set; }
protected async Task ShowRewardsByUrlHandler()
{
var url = "http://www.rseg.net/rewards";
if (await _navigationService.CanNavigate(url))
await _navigationService.Navigate(url);
}
public IMvxAsyncCommand ShowRewardDetailByUrl { get; protected set; }
protected async Task ShowRewardDetailByUrlHandler()
{
var url = "http://www.rseg.net/rewards/1234";
if (await _navigationService.CanNavigate(url))
await _navigationService.Navigate(url);
}
我看到的行为是两个命令最终都导航到 RewardsViewModel,而不是第二个命令导航到 RewwardDetailViewModel;有没有办法指定导航 urls 以便我可以实现我上面描述的行为?
整个示例可以从GitHub https://github.com/rsegtx/So.MvvmNav下载;我只完成了 Android 应用程序的视图。
提前致谢。
我认为您需要 Navigation facade 才能正常工作,并将两个 ViewModel 的路由也更改为 @"http://www.rseg.net/rewards(/(?<id>[0-9]{4}))?$"
:
[assembly: MvxRouting(typeof(SimpleNavigationFacade), @"http://www.rseg.net/rewards(/(?<id>[0-9]{4}))?$")]
namespace *.NavigationFacades
{
public class SimpleNavigationFacade
: IMvxNavigationFacade
{
public Task<MvxViewModelRequest> BuildViewModelRequest(string url,
IDictionary<string, string> currentParameters, MvxRequestedBy requestedBy)
{
var viewModelType = typeof(RewardsViewModel);
if(currentParameters.TryGetValue("id", out string paramId) && !string.IsNullOrEmpty(paramId))
viewModelType = typeof(RewardDetailViewModel);
return Task.FromResult(new MvxViewModelRequest(viewModelType, string.IsNullOrEmpty(paramId) ? new MvxBundle() : new MvxBundle(currentParameters), null));
}
}
}
高