屏幕上的MvvmCross导航

时间:2013-09-11 07:49:17

标签: mvvm xamarin mvvmcross

screen

我们的设计师创建了一个类似上面屏幕的布局。主要的想法是创建一个只有一个屏幕的应用程序,当你点击一个按钮时,只是屏幕的红色部分正在改变(即2个文本框而不是1个文本框)。这个应用程序将是一个多平台应用程序,我使用MvvmCross来创建它。我的问题是我怎样才能在Mvvm中实现这种行为?我的第一个想法是sg。像下面的代码,但我对此解决方案不满意。你对这个问题有什么更好的解决方案吗?我应该以某种方式覆盖ShowViewModel()上的默认导航吗?

public class MainViewModel : MvxViewModel
{
     private MvxViewModel _currentViewModel;
     public MvxViewModel CurrentViewModel
     {
         get { return _currentViewModel; }
         set { _currentViewModel = value; RaisePropertyChanged(() => CurrentViewModel); }
     }

     public MainViewModel()
     {
         CurrentViewModel = new DefaultViewModel();
     }

     public void OnButtonClick()
     {
         CurrentViewModel = new SecondViewModel();
     }
 }

 public partial class MainViewModel : MvxViewController
 {

      public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        FirstViewModel.WeakSubscribe(ViewModelPropertyChanged);
    }

      private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        if (args.PropertyName == "CurrentViewModel")
        {
            if (Model.CurrentViewModel != null)
            {
                if (Model.CurrentViewModel is SecondViewModel) 
                {
                                            //remove bindings
                    //change View
                                            //bind new viewmodel
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

此类“非页面导航”的替代方案与MvvmCross Dialog中的类似:

你可以:

  • 自定义MvxPresenter以允许使用ShowViewModel
  • 在Core项目中放置一个特殊的接口,并使用Inversion of Control将实现从UI项目注入到Core项目
  • 使用MvxMessenger插件并在Core和UI项目之间共享消息,从而触发此类导航。
  • 在ViewModel上使用具有特殊界面的属性(如IInteractionRequest) - 该属性将在UI需要更改时触发事件。

就个人而言,就你的情况而言,我非常喜欢这些选项中的第一个 - 使用演示者截取ShowViewModel

我可能考虑的另一个选择是使用某种“适配器驱动”控件,它可以根据CurrentViewModel属性轻松更新它的子内容。在Android上,这就像使用带适配器的MvxLinearLayout一样简单。然而,在iOS上,我认为你必须写一些新东西才能做到这一点 - 只是因为iOS没有真正的LinearLayout / StackPanel控件。