TabLayout中的片段不绑定到viewmodel

我现在已经在这2天苦苦挣扎了,而且很简单。 由于某种原因,片段的绑定根本不会启动。 页面显示正确,选项卡可以正常工作。 我可以从选项卡1滑动到2,反之亦然。 TextView应该显示viewmodel中的一些文本。 当我调试两个片段视图模型的构造函数时,执行但LoginNotificationViewModel(LoginDescription和LastLoginRequestReceivedOn)上的属性永远不会触发。

我有一个包含TabLayout的视图,如下所示:

        

tabview的代码:

 using Android.App; using Android.OS; using Android.Runtime; using Android.Support.Design.Widget; using Android.Support.V4.View; using Android.Support.V7.Widget; using Android.Views; using MvvmCross.Droid.Support.V4; using Notifier.Adapters; using Notifier.Android.Fragments; using Notifier.Classes; using Notifier.ViewModels; using System; using static MvvmCross.Droid.Support.V4.MvxCachingFragmentStatePagerAdapter; namespace Notifier.Android.Views { [Activity(Label = "HomeNotification", Theme = "@style/Theme.NatuurNetwerk.Main", NoHistory = true)] public class HomeNotificationView : MvxFragmentActivity { private HomeNotificationViewModel _HomeNotificationViewModel; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); _HomeNotificationViewModel = this.ViewModel; SetContentView(Resource.Layout.HomeNotificationView); var fragments = new FragmentInfo[] { new FragmentInfo("Login", typeof(LoginNotificationFragment), typeof(LoginNotificationViewModel)), new FragmentInfo("Tekst", typeof(TextNotificationFragment), typeof(TextNotificationViewModel)), }; var viewPager = FindViewById(Resource.Id.viewpager); viewPager.Adapter = new TabsFragmentPagerAdapter(this, SupportFragmentManager, fragments); // Give the TabLayout to the ViewPager var tabLayout = FindViewById(Resource.Id.sliding_tabs); tabLayout.SetupWithViewPager(viewPager, true); } public override bool OnCreateOptionsMenu(IMenu menu) { SetContentView(Resource.Layout.HomeNotificationView); menu.Add(Menu.None, (int)Parameters.NotificationMenuItems.ResetPincode, 0, Resource.String.menuResetPincode); menu.Add(Menu.None, (int)Parameters.NotificationMenuItems.AddApplication, 0, Resource.String.menuAddApplication); menu.Add(Menu.None, (int)Parameters.NotificationMenuItems.RemoveApplication, 0, Resource.String.menuRemoveApplication); return base.OnCreateOptionsMenu(menu); } public override bool OnOptionsItemSelected(IMenuItem item) { Parameters.NotificationMenuItems menuItemSelected = item.ItemId.GetEnum(); switch (menuItemSelected) { case Parameters.NotificationMenuItems.ResetPincode: _HomeNotificationViewModel.ResetPincode(); break; case Parameters.NotificationMenuItems.AddApplication: break; case Parameters.NotificationMenuItems.RemoveApplication: break; default: throw new InvalidOperationException(string.Format("Notifier: Invalid menu {0}", menuItemSelected.ToString())); } return base.OnOptionsItemSelected(item); } protected override void OnResume() { base.OnResume(); Toolbar toolbar = FindViewById(Resource.Id.toolbar) as Toolbar; if (toolbar != null) { toolbar.Title = _HomeNotificationViewModel.Title; toolbar.Subtitle = _HomeNotificationViewModel.SubTitle; } } } } 

..和它的viewmodel:

 namespace Notifier.ViewModels { public class HomeNotificationViewModel : ViewModelBase { public override string SubTitle => "Notificatie"; public override void InitView() { } public override void InitData() { // TODO: Init Data } public override void ApplicationSelected() { } public void ResetPincode() { DeviceRegistrationHelper.UpdatePincode(null, () => { DetermineAndStartHomeView(); }); } } } 

其中一个片段涉及:

      

登录片段代码:

 using Android.OS; using Android.Views; using Notifier.ViewModels; namespace Notifier.Android.Fragments { public class LoginNotificationFragment : BaseFragment { protected override int LayoutResource => Resource.Layout.LoginNotificationFragment; public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.Inflate(Resource.Layout.LoginNotificationFragment, container, false); } } } 

..及其基类:

 using MvvmCross.Droid.Support.V4; using Notifier.Android.Views; using Notifier.ViewModels; namespace Notifier.Android.Fragments { public abstract class BaseFragment : MvxFragment where TViewModel : ViewModelBase { protected abstract int LayoutResource { get; } } } 

视图模型:

 using Notifier.Classes; using System; using System.Linq; namespace Notifier.ViewModels { public class LoginNotificationViewModel : ViewModelBase { public override string SubTitle => "Inlog notificatie"; public String Status { get; set; } public override void InitView() { } public override void InitData() { // TODO: Init Data } public override void ApplicationSelected() { } public string LoginDescription { get => Settings.HasNotification ? string.Format("Er is een inlog verzoek ontvangen voor {0}", ApplicationShortName(Settings.Notification.ApplicationId)) : "Geen openstaande inlogverzoeken"; } ///  /// Short name for the application ///  private string ApplicationShortName(int applicationId) { return Applications.Where(app => app.ApplicationID == applicationId).FirstOrDefault()?.ApplicationEntity.ApplicationShortName; } public string LastLoginRequestReceivedOn { get => string.Format("Laatste inlogverzoek: {0}", Settings.HasLastNotificationReceivedOn ? string.Empty : Settings.LastNotificationReceivedOn.ToString("DD-MM-YYYY HH:MM")); } } } 

和(部分)基类:

 namespace Notifier.ViewModels { ///  /// Base class for all view models. ///  public abstract class ViewModelBase : MvxViewModel { private readonly IPlatformEntrance _platformEntrance; private readonly IPlatformLog _platformLog; public string Title => "nNotifier©"; public ViewModelBase() { _platformEntrance = Mvx.Resolve(); _platformLog = Mvx.Resolve(); InitData(); } public abstract void InitData(); public abstract string SubTitle { get; } ... } } 

这是PageAdapter:

 using Android.Content; using Android.Support.V4.App; using MvvmCross.Droid.Support.V4; namespace Notifier.Adapters { public class TabsFragmentPagerAdapter : MvxCachingFragmentStatePagerAdapter { FragmentInfo[] _fragments; public TabsFragmentPagerAdapter(Context context, FragmentManager fragmentManager, FragmentInfo[] fragments) : base(context, fragmentManager, fragments) { _fragments = fragments; } // public override int Count => _fragments.Length; //public override global::Android.Support.V4.App.Fragment GetItem(int position, // global::Android.Support.V4.App.Fragment.SavedState fragmentSavedState = null) //{ // return _fragments[position]; //} //public override ICharSequence GetPageTitleFormatted(int position) //{ // return _titles[position]; //} } } 

您需要使用BindingInflate()而不是默认的Android inflater,因为它不知道如何处理MvxBind属性。

 using MvvmCross.Binding.Droid.BindingContext; ... public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { var ignored = base.OnCreateView(inflater, container, savedInstanceState); var view = this.BindingInflate(Resource.Layout.MyFragmentLayout, container, false); return view; }