[ Xamarin ] 頁面傳遞參數 Navigation Passing Data

前面文章我們談了導航( navigation )的基本概念,而在導航的過程中有時會需要有傳遞參數的需求,本篇就來談頁面傳遞參數( Navigation Passing Data )的幾種做法。

首先我們建立一個示範的例子,這個例子很簡單只有一個輸入框,以及一個傳送至下一頁的按鈕,並且新增一個 Page1 做為接收參數並顯示的頁面,程式碼如下

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XAppPassData"
             x:Class="XAppPassData.MainPage">
  <StackLayout Orientation="Vertical" VerticalOptions="CenterAndExpand" >
    <Entry x:Name="UserName" Placeholder="User Name"/>
    <Button x:Name="SendBtn" Text="Send to Next Page"/>
  </StackLayout>
</ContentPage>
  • 透過改變 Page Constructor 傳遞參數

這個方式主要是利用修改 Page Constructor,讓 Page Constructor 變成是帶有參數的 Constructor,首先我們先把 Page1 Constructor 改為如下所示,Constructor 的參數我們先簡單使用簡單型別 string 。

而 Page1 頁面則是安排一個 Label 做為顯示所接收到的資料之用

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XAppPassData.Page1">
  <Label x:Name="ShowText" 
         VerticalOptions="Center" 
         HorizontalOptions="Center" />
</ContentPage>

接著回到 MainPage 頁面,請考慮以下程式碼,在傳送按鈕的 click 事件,我們將輸入框的資料做為 Page1 Constructor 的參數,並且叫用 Navigation.PushAsync 進行導航動作。

public MainPage()
{
	InitializeComponent();
	this.SendBtn.Clicked += SendBtn_Clicked;
}

private async void SendBtn_Clicked(object sender, EventArgs e)
{
	await Navigation.PushAsync(new Page1(this.UserName.Text));
}

最後 Page1 頁面,請考慮以下程式碼,直接將 Constructor 的參數指定為 Label 控制項的 Text 屬性值來源,如此便能顯示由主頁面所傳遞過來的資料。

public Page1(string arg)
{
	InitializeComponent();
	this.ShowText.Text = arg;
}

同上例子,如果我們要傳遞的參數不是簡單的 string ,那該如何進行?沒人限制 Constructor 只能是 string 型別對吧,那麼你應該知道怎麼做了吧,首先我們先建一個 User 的自訂型別,請考慮以下程式碼

public class UserModel
{
	public String Name { get; set; }
	public String Email { get; set; }
}

接著稍微修改一下主頁面的傳送按鈕事件,請考慮以下程式碼

private async void SendBtn_Clicked(object sender, EventArgs e)
{
	await Navigation.PushAsync(new Page1(new UserModel()
	{
		Name = this.UserName.Text,
		Email = string.Empty
	}));
}

最後 Page1 Constructor 參數必須改為我們的自訂型別 User,請考慮以下程式碼,如此一來便能在跨頁面中傳遞複雜型別。

public Page1(UserModel arg)
{
	InitializeComponent();
	this.ShowText.Text = arg.Name;
}

到目前為止都是利用 Page Constructor 來做參數的傳遞,接下來我們要改用另外一種方式,同樣能做到跨頁面的參數傳遞。

  • 透過 Page 的 BindingContext 屬性

延續上述的範例,首先 Page1 的 Constructor 先恢復為無參數的 Constructor,如下所示

public Page1()
{
	InitializeComponent();
}

接著主頁面的傳送按鈕事件,請考慮以下程式碼,在這裡我們建立了 UserModel 實體物件,並指定該物件的 Name 屬性值為 this.UserName.Text,接著把該物件設定為 Page1 的 BindingContext 屬性值。

private async void SendBtn_Clicked(object sender, EventArgs e)
{
	var page1 = new Page1();
	page1.BindingContext = new UserModel()
	{
		Name = this.UserName.Text,
		Email = string.Empty
	};

	await Navigation.PushAsync(page1);
}

最後回到 Page1 的 Xaml 頁面,透過 Binding 的方式,完成資料的顯示。

<Label x:Name="ShowText" 
         Text="{Binding Name}"
         VerticalOptions="Center" 
         HorizontalOptions="Center" />

不論用哪一種方式,均可以達成跨頁面資料的傳遞,執行結果如下所示。

 

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18