Как передать переменную CollectionData со страницы сведений на другие страницы приложения Xamarin?

#xamarin #xamarin.forms

Вопрос:

Я использую Xamarin.Формирует шаблон вкладок для создания базового приложения для исторического общества.

Я использую страницу CollectionData (ItemsPage) для перехода на страницу Itemdetail.

Затем я хочу перейти со страницы Itemdetail на другую страницу (отображение), которая сохраняет идентификатор элемента, чтобы он загружал правильные переменные из хранилища данных для местоположения на карте. Поэтому, по сути, я хочу сделать:

Страница элементов gt; Страница элементов gt;gt; Отображение

Как переместить идентификатор элемента между страницей Itemdetail и отображением?

Я загрузил данные на свою страницу моделей просмотра MapViewPage:

 using Paston_Design_2.Models; using System; using System.Diagnostics; using System.Threading.Tasks; using Xamarin.Forms;  namespace Paston_Design_2.ViewModels {  [QueryProperty(nameof(ItemId), nameof(ItemId))]  public class MapViewModel : BaseViewModel  {  private string itemId;  private string text;  public string Id { get; set; }   public string Text  {  get =gt; text;  set =gt; SetProperty(ref text, value);  }   public string ItemId  {  get  {  return itemId;  }  set  {  itemId = value;  LoadItemId(value);  }  }  public async void LoadItemId(string itemId)  {  try  {  var item = await DataStore.GetItemAsync(itemId);  Id = item.Id;  Text = item.Text;  }  catch (Exception)  {  Debug.WriteLine("Failed to Load Item");  }  }  } }  

И в коде для моей страницы Itemdetail добавлена эта ссылка:

 namespace Paston_Design_2.Views {  public partial class ItemDetailPage : ContentPage  {  public ItemDetailPage()  {  InitializeComponent();  BindingContext = new ItemDetailViewModel();  }  private async void Map_Clicked(object sender, EventArgs e)  {  await Shell.Current.GoToAsync($"{nameof(Map)}?{nameof(MapViewModel.ItemId)}");  }  } }  

But if I add ItemID to to the end of the await command (which I’d like to do to keep the Shell Stack and navigation links), it’s not recognised:

 await Shell.Current.GoToAsync($"{nameof(Map)}?{nameof(MapViewModel.ItemId)}={itemId}");  

I realise I’m probably missing the obvious, but I can’t find any tutorials that specifically address this issue (probably due to my inexperience with the Xamarin terminology), and any help would be much appreciated, even if it’s a link to a resource that lays it out.

Annoyingly I’ve noticed that if I mess with the code on the ItemDetailPage (such as duplicating one of the image buttons) it works on the VM! But then it stops working on the next compilation.

Just adding some images to clarify what I’m trying to achieve:

This is the ItemPage

Второй экран-это страница Itemdetail

Третья-это следующая страница в стеке, на которую я хочу вставить идентификатор элемента, чтобы использовать его для вызова информации из этой записи

Комментарии:

1. как вы передаете идентификатор элемента на страницу Itemdetail? Тот же механизм должен работать для любой другой страницы

2. Вы можете создать новый проект с шаблоном оболочки. В нем есть подробная информация о том, как перемещаться с помощью ItemId. Если вы хотите использовать код Shell.Current.GoToAsync($"{nameof(Map)}?{nameof(MapViewModel.ItemId)}={itemId}"); , необходимо передать идентификатор элемента.

3. Я взял код страниц/представлений карты непосредственно со страницы Itemdetail в попытке воспроизвести метод, но он не работает, скорее всего, из-за того, что я использую код, который берет выбранный элемент и пытается использовать его там, где данные не поступают из списка. Что мне нужно, так это: 1. Изолировать идентификатор элемента 2. Создайте var для этого идентификатора элемента на странице .cs над кодом навигации 3. Поместите переменную в ссылку, у меня просто возникли некоторые проблемы с синтаксисом, и я задался вопросом, делалось ли это раньше с примером.

4. Если бы вы могли создать идентификатор элемента, навигация работала бы.