Piotrek
Piotrek

Reputation: 11211

How to pass data to the previous page using PopAsync?

Consider the following scenario:

  1. User is on some Page 1
  2. He clicks button that moves him to Page 2 (calling await Navigation.PushAsync(new SomePage()); )
  3. After finishing certain action, he clicks "OK" button
  4. After clicking "OK", app calls PopAsync to move to Page 1 and sends there some data (result of activity on Page 2).

How can I receive data from Page 2 in Page 1?

Upvotes: 18

Views: 17217

Answers (2)

hvaughan3
hvaughan3

Reputation: 11105

You could use either my answer here or SushiHangover's answer on the same page.

My answer will work in a ContentPage and SushiHangover's will work anywhere.

My answer involves subscribing to ContentPage.OnDisappearing from Page 1 before doing your PushAsync().

If the data being changed is saved to a DB in Page 2, you can just use Page 1's OnAppearing() event to always pull fresh from the DB, which would pull in the new data that was changed on Page 2. OnAppearing() would get executed after Page 2 is popped and the user is returning to Page 1.

Upvotes: 7

Dakshal Raijada
Dakshal Raijada

Reputation: 1261

The best way (IMO) would be to handle the pop from the originating page by raising an event. Something like this:

public class LoginPage : ContentPage
{
    public event EventHandler LoginSucceeded;

    public event EventHandler LoginFailed;

    private void OnLoginSucceeded()
    {
        if (LoginSucceeded != null)
        {
            LoginSucceeded(this, EventArgs.Empty);
        }
    }

    private void OnLoginFailed()
    {
        if (LoginFailed != null)
        {
            LoginFailed(this, EventArgs.Empty);
        }
    }
}

and from app.cs

public class App : Application
{
    public App()
    {
        var loginPage = new LoginPage();
        loginPage.LoginSucceeded += HandleLoginSucceeded;
        MainPage = loginPage;
    }

    private void HandleLoginSucceeded(object sender, EventArgs e)
    {
        MainPage = new MainPage();
    }
}

You can read more about it over here -- Really good article

Another option is to use MessagingCenter

Upvotes: 16

Related Questions