如何在返回后刷新页面。OnAppearing未被调用。

3
在我的主页面上,我加载当前元素并显示数据(例如卡片)。用户可以使用PushAsync导航到详细信息或编辑页面并更新数据。从导航栏返回时不会调用OnAppearing,因此我无法刷新地图(设置位置)。
解决方法可能如下: 主页面>详细页面>编辑页面
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,并且我使用shell。
最初的回答:您可以尝试使用MessagingCenter来在页面之间传递消息。除此之外,还有一些其他选项可供选择,但这取决于您的具体情况和需求。请注意,您正在使用的Xamarin Forms版本为4.0,并且使用shell。

你真的没有包含足够的代码来说明你如何传递数据。如果你使用数据绑定和 INPC,那么通常情况下 UI 应该在数据更改时自动更新。 - Jason
你可以在详情页使用 onDisappearing() 方法并重新加载数据。将你的 setLocation() 方法设为静态方法,并从详情页的 onDisappearing() 方法中调用它。 - sudesh regmi
@Jason:我使用数据绑定,但是地图没有当前位置的属性。 - jckruse
啊,好的 - 那我可能会使用MessagingCenter来完成它。 - Jason
好的,谢谢你,Jason! - jckruse
1个回答

3
你可以尝试使用事件来触发一些命令,当导航从下一页返回时。
首先,在你的DetailPage中定义一个事件:
public delegate void UpdateLocation(string info);
public event UpdateLocation UpdateLocationEvent;

Then register this event when you pushed:

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

谢谢您的建议,我现在使用 MessagingCenter 和 Delegates 的组合。 - jckruse
@jckruse,很高兴你解决了问题。如果你觉得这个回答有帮助,请接受它作为答案。 - Ax1le

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接