首页 > 解决方案 > 如何将 CollectionData 变量从详细信息页面传递到 Xamarin 应用程序中的其他页面?

问题描述

我正在使用 Xamarin.Forms 选项卡模板为历史社会创建一个基本应用程序。

我正在使用 CollectionData 页面 (ItemsPage) 链接到 ItemDetailPage。

然后我想从 ItemDetailPage 链接到另一个保留 ItemID 的页面(MapPage),以便它将从 DataStore 加载正确的变量以获取地图位置。所以基本上我想做:

ItemsPage > ItemDetailPage > MapPage

如何在 ItemDetailPage 和 MapPage 之间移动 ItemID?

我已将数据加载到我的 MapViewPage ViewModels 页面中:

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 => text;
            set => 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");
            }
        }
    }
}

在我的 ItemDetailPage 的代码隐藏中,添加了此链接:

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

但是,如果我将 ItemID 添加到 await 命令的末尾(我想这样做以保留 Shell Stack 和导航链接),则无法识别:

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

我意识到我可能错过了明显的,但我找不到任何专门解决这个问题的教程(可能是由于我对 Xamarin 术语的缺乏经验),任何帮助将不胜感激,即使它是一个链接列出它的资源。

恼人的是,我注意到如果我弄乱了 ItemDetailPage 上的代码(例如复制其中一个图像按钮),它可以在 VM 上运行!但随后它停止进行下一次编译。

只需添加一些图像来阐明我想要实现的目标:

这是项目页面

第二个屏幕是 ItemDetailPage

第三是堆栈中的下一页,我想将 ItemID 拉入其中,以便我可以使用它来调用该记录中的信息

标签: xamarinxamarin.forms

解决方案


推荐阅读