Xamarin Forms 5.0.0.2515: Relative routing to shell elements is currently not supported

Viewed 29

I am receiving the below error :

Relative routing to shell elements is currently not supported. I am running Xamarin forms 5.0.0.2515.

The project navigates to the Items Journal Template View Model where I select an item. The item's name is then passed to the Finished Goods View Model where I will do a search based on the value passed. However I am receiving the above error even though I have already done this on other pages without an error.

I have my routing registered:

    public AppShell()
    {
        InitializeComponent();
        Routing.RegisterRoute(nameof(LocatePage), typeof(LocatePage));
        Routing.RegisterRoute(nameof(FinishedGoodsPage), typeof(FinishedGoodsPage));
        Routing.RegisterRoute(nameof(ItemJournalTemplatePage), typeof(ItemJournalTemplatePage));
    }

ItemJournalTemplateViewModel: I call the Finished Goods page and pass it the item's name...

        async void SelectedItemJournalTemplate(ItemJournalTemplate item)
        {
            if (item == null)
                return;

            await Shell.Current.GoToAsync($"{nameof(FinishedGoodsPage)}?{nameof(FinishedGoodsViewModel.PassedJournalBatchName)}={item.Name}");

        }

and the page receiving the call FinishedGoodsViewModel:

    [QueryProperty(nameof(PassedJournalBatchName), nameof(PassedJournalBatchName))]
    public class FinishedGoodsViewModel:BaseViewModel
    {
        private string passedJournalBatchName;
        public string PassedJournalBatchName
        {
            get => passedJournalBatchName;
            set
            {
                passedJournalBatchName = value;

                OnPropertyChanged(nameof(PassedJournalBatchName));
            }
        } .....
    }

What makes this odd is that I use this on the FinishedGoodsViewModel to call the LocateViewModel and it works fine:

    public async void UpdateLocation(object value)
    {
        SelectedValue = (FinishedGood)value;

        await Shell.Current.GoToAsync($"{nameof(LocatePage)}" +
            $"?{nameof(LocateViewModel.ItemNo)}={SelectedValue.Item_No}" +
            $"&{nameof(LocateViewModel.BatchName)}={SelectedValue.Journal_Batch_Name}" +
            $"&{nameof(LocateViewModel.TemplateName)}={SelectedValue.Journal_Template_Name}" +
            $"&{nameof(LocateViewModel.LineNo)}={SelectedValue.Line_No}");
    }

LocateViewModel:

        [QueryProperty(nameof(ItemNo), nameof(ItemNo))]
        [QueryProperty(nameof(BatchName), nameof(BatchName))]
        [QueryProperty(nameof(TemplateName), nameof(TemplateName))]
        [QueryProperty(nameof(LineNo), nameof(LineNo))]
    
    
    public class LocateViewModel : BaseViewModel
    {
        private string batchName;
        public string BatchName 
        { get => batchName;
            set
            {
                batchName = value;
    
                OnPropertyChanged(nameof(BatchName));
            }
        }
    
        private string templateName;
        public string TemplateName
        {
            get => templateName;
            set
            {
                templateName = value;
    
                OnPropertyChanged(nameof(TemplateName));
            }
        }
    
        private string lineNo;
        public string LineNo
        {
            get => lineNo;
            set
            {
                lineNo = value;
    
                OnPropertyChanged(nameof(LineNo));
            }
        }
    
        private string itemNo;
        public string ItemNo
        {
            get => itemNo;
            set
            {
                itemNo = value;
    
                OnPropertyChanged(nameof(ItemNo));
            }
        }...
    }

Can someone please tell me where I am going wrong here?

1 Answers

It looks like the answer was in the AppShell.xaml file. The original Flyout pointed to the FinsishedGoodsPage but I changed it to ItemJournalTemplatePage, allowing the user to first make a selection first.

<FlyoutItem Title="Finished Goods" Icon="placeholder.png">
    <ShellContent Route="FinishedGoodsPage" ContentTemplate="{DataTemplate local:ItemJournalTemplatePage}" />
</FlyoutItem>

I forgot I also needed to change the Route. It probably would not go to the FinishedGoodsPage because it thought it was already on that page.

<FlyoutItem Title="Finished Goods" Icon="placeholder.png">
    <ShellContent Route="ItemJournalTemplatePage" ContentTemplate="{DataTemplate local:ItemJournalTemplatePage}" />
</FlyoutItem>
Related