Как обновить страницу после перехода назад. OnAppearing не вызывается - PullRequest
0 голосов
/ 11 июня 2019

На моей главной странице я загружаю текущий элемент и отображаю такие данные, как карточка.Пользователь может использовать PushAsync для перехода на страницу сведений или редактирования и обновления данных.

Возврат с панели навигации не вызывает OnAppearing, поэтому я не могу обновить карту (указать местоположение).

Способ может выглядеть следующим образом: MainPage> DetailPage> EditPage

public MainPage()
{
  InitializeComponent();

  SetLocation();
}

protected override async void OnAppearing()
{
  base.OnAppearing();

  var vm = BindingContext as MainViewModel;
  await vm?.InitializeAsync(null);

  SetLocation();
}

void SetLocation()
{
  try {
    var location = (BindingContext as MainViewModel).Location;

    if (location == null) {
      location = DataObjects.Location.Parse(AppSettings.Current.FallbackMapsLocation);
    }

    var initialPosition = new Position(
        location.Latitude,
        location.Longitude);

    var mapSpan = MapSpan.FromCenterAndRadius(
        initialPosition,
        Distance.FromMiles(1.0));

    Map.MoveToRegion(mapSpan);
  }
  catch (FeatureNotSupportedException) {
  }
}

Из EditPage я дважды перехожу назад (DetailPage, а затем MainPage).Сам мой объект обновлен и получает изменения через OnPropertyChanged, поэтому у меня также есть текущее местоположение.

Должен ли я использовать MessagingCenter или есть другие / лучшие варианты?Версия Xamarin Forms 4.0, и я использую оболочку

1 Ответ

1 голос
/ 12 июня 2019

Вы можете попытаться использовать событие, если хотите вызвать некоторые команды, когда навигация происходит со следующей страницы.

Во-первых, определите событие в вашем DetailPage:

public delegate void UpdateLocation(string info);
public event UpdateLocation UpdateLocationEvent;

Затем зарегистрируйте это событие, когда вы нажали:

var detailPage = new DetailPage(new DetailViewModel(item));
detailPage.UpdateLocationEvent += (info) =>
{

};
await Navigation.PushAsync(detailPage);

Наконец, вы можете вызвать это событие, чтобы вызвать блок кода в MainPage.то есть в исчезающем событии страницы сведений:

protected override void OnDisappearing()
{
    base.OnDisappearing();

    UpdateLocationEvent?.Invoke("location info");
}
...