【问题标题】:MvvmCross initial IMvxViewModel ViewAppeared not being called when in an MvxTabbbedPage on Android在Android上的MvxTabbbedPage中未调用MvvmCross初始IMvxViewModel ViewAppeared
【发布时间】:2019-07-02 16:30:51
【问题描述】:

我们的 Xamarin.Forms 项目中有一个 MvxTabbedPage 和子 MvxContentPages。

在 Android 上,我发现我的第一个子页面上的 ViewAppeared 覆盖在第一次显示 MvxTabbedPage 时没有被调用。

切换选项卡时,它随后被正确调用。

我正在为MvxTabbedPage 的PageModel 初始化ViewAppearing 中的PageModels,如下所示:

public override async void ViewAppearing()
{
    await ShowInitialViewModels();
    base.ViewAppearing();
}

private bool viewModelsInitialised = false;
private async Task ShowInitialViewModels()
{
    if (!viewModelsInitialised)
    {
        await _BusyManager.SetBusy();
        var tasks = new List<Task>();
        tasks.Add(_MvxNavigationService.Navigate<HomePageModel>());
        tasks.Add(_MvxNavigationService.Navigate<MyBenefitsPageModel>());
        tasks.Add(_MvxNavigationService.Navigate<ClaimsPageModel>());
        tasks.Add(_MvxNavigationService.Navigate<ContactUsPageModel>());
        tasks.Add(_MvxNavigationService.Navigate<SettingsPageModel>());
        await Task.WhenAll(tasks);
        viewModelsInitialised = true;
        await _BusyManager.SetUnBusy();
    }
}

其他人是否看到过这种行为,和/或我是否应该采取不同的做法?

【问题讨论】:

    标签: android xamarin.forms mvvmcross


    【解决方案1】:

    看起来是这个表单错误:

    https://github.com/xamarin/Xamarin.Forms/issues/3855

    这个 MvvmCross 问题引用了它

    https://github.com/MvvmCross/MvvmCross/issues/2823

    (感谢 Pedro 在 Slack 上为我指出了这个方向:)

    【讨论】:

      【解决方案2】:

      检查 mvvmcross 的Playground project。您应该在视图模型和后面的 XF 视图代码中分别管理选项卡初始化。

      public class YourTabsViewModel : MvxViewModel
      {
          private readonly IMvxNavigationService _navigationService;
      
          public YourTabsViewModel(IMvxNavigationService navigationService)
          {
              _navigationService = navigationService;
      
              ShowInitialViewModelsCommand = new MvxAsyncCommand(ShowInitialViewModels);
          }
      
          public IMvxAsyncCommand ShowInitialViewModelsCommand { get; private set; }
      
          private async Task ShowInitialViewModels()
          {
              var tasks = new List<Task>
              {
                  tasks.Add(_navigationService.Navigate<HomePageModel>();
                  tasks.Add(_navigationService.Navigate<MyBenefitsPageModel>());
                  tasks.Add(_navigationService.Navigate<ClaimsPageModel>());
                  tasks.Add(_navigationService.Navigate<ContactUsPageModel>());
                  tasks.Add(_navigationService.Navigate<SettingsPageModel>());
              }
      
              await Task.WhenAll(tasks);
          }
      }
      

      然后是 XF 视图背后的代码

      [MvxTabbedPagePresentation(TabbedPosition.Root, NoHistory = true)]
      public partial class YourTabsPage : MvxTabbedPage<YourTabsViewModel>
      {
          public YourTabsPage()
          {
              InitializeComponent();
          }
      
          private bool _firstTime = true;
      
          protected override void OnAppearing()
          {
              base.OnAppearing();
      
              if (_firstTime)
              {
                  ViewModel.ShowInitialViewModelsCommand.ExecuteAsync(null);
      
                  _firstTime = false;
              }
          }
      }
      

      【讨论】:

      • 这不是和我已经在做的一样吗?我上面发布的代码来自 ViewModel。我在上面提到的错误描述了我看到的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多