2017-12-28 20 views
0

this github 예제의 도움말을 사용하여 Master-Detail Navigation을 만들려고합니다. 내 프로젝트에서 관련 코드 샘플이 -Xamarin Forms의 Master-Detail Page에서 문자열 데이터를 전달하는 방법

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

, 다음 코드 샘플입니다 나는 마스터 - 세부 정보 탐색에서 url 통과하는 방법을 여기에

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

내가 알아낼 수없는 오전 - 페이지 WebPage 하시나요?

답변

1

일반화 된 방법 : 여기

//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#을 객체를 직렬화하고 myStringParam에 JSON을 문자열을 전달할 수 있습니다. 페이지가 정의한 페이지의 매개 변수화 된 생성자에서이를 받으면 비 직렬화 할 수 있으므로 복잡한 객체를 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

System.Type

객체의 유형

인수 유형을 만들 :

당신이 원하는 하나는

Activator.CreateInstance Method (Type, Object[])

이 매개 변수

유형 유형이 여기에 있습니다 : 체계.Object []

숫자가 일치하는 배열의 배열로 주문하고 호출 할 생성자의 매개 변수를 입력하십시오. 인수 는 하늘의 배열 또는 null, 매개 변수를 (기본 생성자)를 취하지 않는 생성자 인 경우 호출입니다

+0

모두 대답은 동일 내가 최선을 이렇게 upvoted 것을 선택했다 –