【问题标题】:MvvmCross app-wide NavigationDrawer implementation xamarin.droidMvvmCross 应用程序范围的 NavigationDrawer 实现 xamarin.droid
【发布时间】:2014-05-01 06:16:55
【问题描述】:

我一直在玩这个,我只是想知道添加应用程序范围的 NavigationDrawer 的最佳方法。

  1. 据我所知,最好的方法是实现 v4 小部件系统并将每个视图作为片段并将其放入“HomeView”(这只是包含 NavigationDrawer 的主视图和以编程方式进行的片段覆盖)。这种方法在理论上似乎是最干净的,但是我失去了使用 MvvmCross 带来的所有细节,并且似乎使用它毫无意义。我的意思是我将不再使用视图模型上的 ICommand 绑定来从片段内导航到另一个子页面/片段。 (除非我弄错了?)
  2. 我想到的另一种方法是有效地拥有一个“主”基本视图,我的所有视图都继承自该基本视图,其中包含一个不使用片段的自定义 NavigationDrawer。但是找到这种设置的示例似乎是不可能的,而且我对 Xamarin/MvvmCross 还很陌生,还不能尝试这种类型的结构。

对于这方面的最佳做法,有人有任何建议或想法吗?理想情况下,我想要选项 1,但我想在 ViewModel 中保留和维护 ICommand 绑定以实现跨平台兼容性。

【问题讨论】:

  • 也许有一种方法可以提供自定义的 MvxAndroidViewPresenter,它在“Show”方法中确定“showViewModelRequest”对象中的类型是 Activity 类型还是 Fragment 类型。如果 Fragment 则传递给当前活动 Activity 上的“HandleFragment”方法?
  • 我意识到这是一个老问题,但这种方法对此非常有帮助:gregshackles.com/…

标签: android-fragments xamarin.android xamarin mvvmcross


【解决方案1】:

我最终选择了选项 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);
        }
    }

但这对我来说暂时有用,直到我有更多的时间来将其抽象出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多