【问题标题】:OnAppearing event firing twice .with tabbed pageOnAppearing 事件触发两次。带有标签页
【发布时间】:2016-12-08 14:35:26
【问题描述】:

作为 Xamarin 表单和 MVVM 的初学者,我面临着问题。我有 tabbedpage 和 2 个页面在 tag 下。这是代码。

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

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

这里是代码标签页 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);
        }


    }

提前致谢...

【问题讨论】:

  • 能否请您添加您尝试过的代码..因为没有它无法配置您的问题???
  • 我已经为两个页面添加了代码。请看一下
  • 遇到同样的“问题”...您设法解决了吗?
  • 同样的问题
  • 最新版本相同。

标签: xaml mvvm xamarin.ios xamarin.android xamarin.forms


【解决方案1】:

遇到这个问题很久了,在意识到之前,我知道这是多么令人沮丧。由于选项卡式页面呈现所有单个页面的方式,事件OnAppearing() 会触发两次。它最初呈现页面,然后在您的情况下将呈现另一个页面,这会导致 OnDisappearing() 触发。然后第一页获得焦点,导致OnAppearing() 再次触发。

如果您只希望代码触发一次,则在添加子页面后,将 currentpage 属性设置为 null,这应该会阻止 OnAppearing() 再次触发

【讨论】:

    【解决方案2】:

    就我而言,OnAppearing 调用了两次,而我在 app.xaml 中有以下代码:

    MainPage = new NavigationPage(new MainPage());
    

    在我将代码更改为:

    MainPage =new MainPage();
    

    OnAppearing 不再调用两次。

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 2013-06-15
      • 2013-03-28
      • 2013-09-12
      相关资源
      最近更新 更多