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

时间:2017-12-28 08:08:25

标签: c# xaml xamarin xamarin.forms master-detail

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

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

Activator.CreateInstance Method

你想要的就是这里

Activator.CreateInstance Method (Type, Object[])

参数

  

类型类型:System.Type

     

要创建的对象类型

     

args类型:System.Object []

     

数量匹配的参数数组,   order,并键入要调用的构造函数的参数。如果args   是一个空数组或null,不带参数的构造函数   (默认构造函数)是调用