首页 > 解决方案 > 替换viewpager Mvvmcross中的片段

问题描述

tldr:如何使用 MvvmCross 替换 viewpager 中的片段?

我尝试使用如何替换 Viewpager 中的片段中描述的方法来替换 viewpager 中的片段。这个想法是在视图寻呼机中显示“RootFragment”。然而,它被第一个片段所取代。如果需要,也可以用第二个片段、第三个片段等替换。随着更多片段的添加,它们也被添加到后台堆栈中。

所以这将是“RootFragment”的代码片段

public class RootView : MvxFragment
    {
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var view = inflater.Inflate(Resource.Layout.root_fragment, container, false);

        var transaction = FragmentManager.BeginTransaction();
        var fragment = FirstView.NewInstance();
        transaction.Replace(Resource.Id.root_frame, fragment);

        transaction.Commit();

        return view;
    }


}

然后,“第一个片段”的片段将是

[MvxFragmentPresentation(typeof(MainViewModel), 
Resource.Id.root_frame, true)]
    public class ScoringView : MvxFragment<FirstViewModel>
    {
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            base.OnCreateView(inflater, container, savedInstanceState);
            return this.BindingInflate(Resource.Layout.first_fragment, null);
        }

    }

“RootFragment”的布局是:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:background="#000"
    android:layout_height="match_parent"
    android:id="@+id/root_frame" />

“FirstViewModel”的代码是:

public class FirstViewModel: MvxViewModel
    {
        private IMvxAsyncCommand _openPreguntasCommand;
        private IMvxNavigationService _navigationService;

        public IMvxAsyncCommand OpenSecondCommand { get => _openSecondCommand?? (new MvxAsyncCommand(async () =>
                                                                  {
                                                                      await _navigationService
                                                                          .Navigate<SecondViewModel>();
                                                                  }));  }

        public FirstViewModel(IMvxNavigationService navigationService)
        {
            _navigationService = navigationService;
        }


    }

我尝试使用 PresentationHint 来完成这项任务。我修改了如何使用视图模型(导航服务)清除整个 Backstack 中使用的代码以满足我的需要,但无济于事。因此,也许自定义演示者可能是一种选择。我可以覆盖一个“OnBeforeFragmentChanging”或其他一些相关方法。我最终做的是使用 MvxFragmentPresentation 属性,并将 fragmentContentId 设置为“RootFragment”布局中占位符的 Id。但是,在我看来,必须有更好的方法。

 [MvxFragmentPresentation(typeof(MainViewModel), Resource.Id.root_frame, true)] 

标签: xamarin.androidmvvmcross

解决方案


您是否尝试过 MvvmCross 源代码附带的 Playground 示例?有很好的片段实现


推荐阅读