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

问题描述 投票:1回答:2

我正在尝试使用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;
    }
}

如果没有数据需要传递到详细信息页面,它就可以工作。但是,我需要在页面url中传递一个字符串值WebPage,但我无法弄清楚如何传递字符串值或以下行中的任何数据 -

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

例如,以下是页面WebPage的代码示例 -

public WebPage (string URL)
{
    InitializeComponent ();
    Browser.Source = URL;
}

在这里我无法弄清楚,我应该如何从Master-Detail Navigation传递url

c# xaml xamarin xamarin.forms master-detail
2个回答
3
投票

广义方式:

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

1
投票

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

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

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

Activator.CreateInstance Method

你想要的就是这里

Activator.CreateInstance Method (Type, Object[])

参数

type类型:System.Type

要创建的对象的类型

args类型:System.Object []

一组参数,它们在数量,顺序和类型上匹配要调用的构造函数的参数。如果args是一个空数组或null,则不调用不带参数的构造函数(默认构造函数)

© www.soinside.com 2019 - 2024. All rights reserved.