我最终选择了选项 1,使用 http://motzcod.es/post/60427389481/effective-navigation-in-xamarin-android-part-1 作为基准点。
我现在有一个主视图 (HomeView),其他所有页面现在都是一个片段,可以放入 content_frame 片段中。
我所有的页面都继承自具有 GoToView 方法的 BaseFrag。这确实意味着我在视图模型中丢失了跨平台 ICommand 绑定,这很可惜。我将来可能会尝试重新审视这个问题。
public abstract class BaseFrag : MvxFragment
{
protected abstract int ViewId { get; }
public override Android.Views.View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater, container, savedInstanceState);
return this.BindingInflate(ViewId, null);
}
protected void GoToView<TFrag, TModel>(TFrag fragment, TModel viewModel) where TFrag : MvxFragment where TModel : MvxViewModel
{
var activity = (HomeView)Activity;
fragment.ViewModel = viewModel;
var trans = activity.SupportFragmentManager.BeginTransaction();
trans.Replace(Resource.Id.content_frame, fragment);
trans.AddToBackStack(null);
trans.Commit();
}
}
我还将尝试重新审视必须传入视图模型并查看 MvvmCross 在后台执行的依赖注入,以减少此过程的手动操作。在我的页面片段中,我只需要将点击事件绑定到 ListViewItem 并调用 GoToView 方法
public class NowShowingView : BaseFrag
{
protected override int ViewId
{
get { return Resource.Layout.NowShowingView; }
}
public override void OnViewCreated(Android.Views.View view, Bundle savedInstanceState)
{
var grid = view.FindViewById<MvxGridView>(Resource.Id.now_showing_grid);
grid.ItemClick = new MvxCommand<RankedMovie>(item =>
{
var viewModel = new MovieDetailsViewModel(new MovieService());
viewModel.Init(item.Title, item.MoviePosterImage, item.Id);
GoToView(new MovieDetailsView(), viewModel);
});
base.OnViewCreated(view, savedInstanceState);
}
}
但这对我来说暂时有用,直到我有更多的时间来将其抽象出来。