如何从 Xamarin Forms 中的主从页面传递字符串数据

How to pass string data from Master-Detail Page in Xamarin Forms

我正在尝试使用 this github 示例的帮助进行主从导航。我项目中的相关代码示例是 -

MasterPageItem.cs

namespace Demo.MenuItems
{
    public class MasterPageItem
    {
        public string Title { get; set; }

        public string IconSource { get; set; }

        public Type TargetType { get; set; }
    }
}

MainPage.Xaml.cs

public partial class MainPage : MasterDetailPage
    {
        public MainPage()
        {
            InitializeComponent();

            masterPage.ListView.ItemSelected += OnItemSelected;

            if (Device.RuntimePlatform == Device.UWP)
            {
                MasterBehavior = MasterBehavior.Popover;
            }

            Detail = new NavigationPage(new HomePage());
        }

        void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var item = e.SelectedItem as MasterPageItem;
            if (item != null)
            {
                Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
                masterPage.ListView.SelectedItem = null;
                IsPresented = false;
            }
        }
    }

MasterPage.Xaml.cs

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MasterPage : ContentPage
{
    public ListView ListView { get { return listView; } }

    public MasterPage()
    {
        InitializeComponent();

        var masterPageItems = new List<MasterPageItem>();

        masterPageItems.Add(new MasterPageItem
        {
            Title = "Help",
            IconSource = "icon-1.jpg",
            TargetType = typeof(WebPage)
        });
        listView.ItemsSource = masterPageItems;
    }
}

详情页不需要传数据就可以。但是,我需要在页面 WebPage 中传递一个字符串值 url,但我无法弄清楚如何在下一行 -

中传递字符串值或任何数据

Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));

例如,以下是页面 WebPage -

的代码示例
public WebPage (string URL)
{
    InitializeComponent ();
    Browser.Source = URL;
}

这里想不通了,Master-Detail Navigation怎么传url

通用方式:

//This will create instance of the page using the parameterized constructor you defined in each DetailPages
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType, myStringParam));


//Your Each Detail Page should have parametrized constructor.
public MyPage (string param)
{
    InitializeComponent ();
    Browser.Source = param;
}

在这里,您可以序列化 c# 对象并将 JSON 字符串传递给 myStringParam。您的页面在您定义的页面参数化构造函数中接收到它,您可以在那里反序列化,因此您可以将复杂对象作为 JSON 传递到页面以及简单字符串中。

如果你只想在一个DetailPage中添加参数化构造器那么:

if(item.TargetType == typeof(WebPage))
{
    Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType, myStringParam));
}
else
{
    Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
}

//Your Page would be:
public WebPage (string URL)
{
    InitializeComponent ();
    Browser.Source = URL;
}

是的,你可以Activator.CreateInstance方法重载

Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType, url));

所有重载都可以在这里找到

Activator.CreateInstance Method

你要的就在这里

Activator.CreateInstance Method (Type, Object[])

参数

type Type: System.Type

The type of object to create

args Type: System.Object[]

An array of arguments that match in number, order, and type the parameters of the constructor to invoke. If args is an empty array or null, the constructor that takes no parameters (the default constructor) is invoke