2017-12-28 6 views
0

Ich versuche, eine Master-Detail-Navigation mit Hilfe von this github Beispiel zu machen. Der entsprechende Code-Beispiel aus meinem Projekt ist -Wie übergebe ich String-Daten von Master-Detail-Seite in Xamarin Forms

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

Es funktioniert, wenn keine Daten in der Detailseite übergeben werden müssen. Ich brauche aber eine String-Wert passiere url in Seite WebPage, aber ich bin nicht in der Lage, herauszufinden, wie String-Wert zu übergeben oder alle Daten in folgenden Zeile -

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

Für zB ist nach dem Codebeispiel für die Seite WebPage -

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

Hier bin ich nicht in der Lage, herauszufinden, wie soll ich url von Master-Detail-Navigation passieren?

Antwort

1

Generalized Way:

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

Hier können Sie die C# Objekt serialisiert und übergeben JSON-String in myStringParam. Ihre Seite empfängt dies in dem von Ihnen definierten parametrisierten Konstruktor der Seite und kann dort deserialisiert werden, so dass Sie komplexe Objekte als JSON in eine Seite sowie als einfache Zeichenfolge übergeben können.

Wenn Sie nur parametrisierte Konstruktor hinzufügen möchten, in einer Detailpage dann:

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

Ja, Sie können Activator.CreateInstance Methode so viele Überlastungen

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

Alle Überlastungen finden Sie hier

Activator.CreateInstance Method

Die Sie ist hier

Activator.CreateInstance Method (Type, Object[])

Parameter

Typ Typ wollen: System.Type

Der Typ des Objekts

args Typ zu erstellen: System.Objekt []

Ein Array von Argumenten, die in der Anzahl übereinstimmen, Reihenfolge, und geben Sie die Parameter des Konstruktors ein, der aufgerufen werden soll. Wenn args ein leeres Array oder null ist, der Konstruktor, der keine Parameter (der Standard-Konstruktor) nimmt, ist aufrufen

+0

beide Antworten waren die gleichen, und ich habe gewählt, dass, wie am besten so upvoted –