在选项卡页面中,OnAppearing事件触发两次。

5

作为Xamarin Forms和MVVM的初学者,我遇到了一些问题。我有一个TabbedPage,其中有两个页面在<Tab>标签下。以下是代码。


问题出在本地:当TabbedPage加载时,ActiveOrderViewPage页面的OnAppearing()事件会触发两次,并且会执行两次OnAppearing()事件下的代码。


请帮助我找出为什么会这样?


以下是Tabbed Page的代码:

tabbedpage.xaml
<TabbedPage
        xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        Title="Orders">
<TabbedPage.Children>  
      <local:ActiveOrderViewPage />  
      <local:SavedOrderViewPage />
</TabbedPage.Children>

tabbedpage.xaml.cs

  public partial class OrderTabViewPage : TabbedPage
{
    public OrderViewModel ViewModel { get { return BindingContext as OrderViewModel; } }
    public OrderTabViewPage()
    {
        InitializeComponent();
     this.BindingContext = ViewModelLocator.OrderVModel;

    }
    public OrderTabViewPage(params object[] arg) : this()
    {
        if (arg != null)
        {
            ViewModel.AccountID = Convert.ToInt32(arg[0]);
        }
    }

这是活动订单 .cs 文件。

 public partial class ActiveOrderViewPage : ContentPage
{
    public OrderViewModel ViewModel { get { return BindingContext as OrderViewModel; } }
    public ActiveOrderViewPage()
    {
        InitializeComponent();
      this.BindingContext = ViewModelLocator.OrderVModel;       
    }

    //public OrderViewPage() : this()
    //{
    //    ViewModel.AccountID = accuntId;
    //}
    protected override void OnAppearing()
    {
        base.OnAppearing();
        if (ViewModelLocator.OrderVModel.ActiveOrderItems == null || ViewModelLocator.OrderVModel.ActiveOrderItems.List.Count == 0)
        {
            ViewModelLocator.OrderVModel.ActiveOrderCommand.Execute(null);
        }


    }

Thanks in advance ...


请问您能否提供您尝试过的代码?因为没有这些信息,我们无法解决您的问题。 - stylishCoder
我已经为两个页面添加了代码,请查看。 - user2797910
同样的问题在这里。 - Thomas
同样的,最新版本。 - 27k1
顺便说一句,这似乎与此问题有关 https://github.com/xamarin/Xamarin.Forms/pull/348 - Cleyton T.
显示剩余2条评论
2个回答

2

长期以来,我一直遇到这个问题,直到意识到这个问题的原因后,我才知道这是多么令人沮丧。由于选项卡页面呈现了所有单独的页面,事件OnAppearing()会触发两次。它最初呈现页面,然后在您的情况下将呈现其他页面,这会导致OnDisappearing()触发。第一页然后获得焦点,导致OnAppearing()再次触发。

如果您只想让代码在添加子页面后执行一次,请将currentpage属性设置为null,这应该可以阻止OnAppearing()再次触发。


0
在我的情况下,当我在app.xaml中有以下代码时,OnAppearing被调用了两次:
MainPage = new NavigationPage(new MainPage());

我将代码更改为以下内容:

MainPage =new MainPage();

OnAppearing不再被调用两次。


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