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