MvvmCross:混合Xamarin.表单和Android活动应用程序

MvvmCross:混合Xamarin.表单和Android活动应用程序,mvvm,xamarin,mvvmcross,xamarin.forms,view-model-pattern,Mvvm,Xamarin,Mvvmcross,Xamarin.forms,View Model Pattern,作为MvvmCross的新手,我决定创建一个小的Xamarin.Forms应用程序。我有一个MainPage.xaml绑定到它的ViewModelMainViewModel.cs,它首先显示。我有一个FirstView.axml位于droid项目及其活动中。关联的ViewModel位于主ViewModel旁边的核心项目中,名为FirstViewModel.cs 单击导航按钮后,我希望MvvmCross显示FirstView.axml布局并绑定到VM。但是, 无论何时调用该命令,我都会得到 03-

作为MvvmCross的新手,我决定创建一个小的Xamarin.Forms应用程序。我有一个
MainPage.xaml
绑定到它的ViewModel
MainViewModel.cs
,它首先显示。我有一个
FirstView.axml
位于droid项目及其活动中。关联的ViewModel位于主ViewModel旁边的核心项目中,名为
FirstViewModel.cs

单击导航按钮后,我希望MvvmCross显示
FirstView.axml
布局并绑定到VM。但是,

无论何时调用该命令,我都会得到

03-10 10:11:38.704 D/ViewRootImpl(18964): ViewPostImeInputStage ACTION_DOWN
mvx:Diagnostic: 17,87 Showing ViewModel FirstViewModel
03-10 10:11:38.854 I/mono-stdout(18964): mvx:Diagnostic: 17,87 Showing ViewModel FirstViewModel
[0:] mvx:Diagnostic: 17,87 Showing ViewModel FirstViewModel
mvx:Error: 17,91 Failed to create ContentPage FirstPage
03-10 10:11:38.894 I/mono-stdout(18964): mvx:Error: 17,91 Failed to create ContentPage FirstPage
[0:] mvx:Error: 17,91 Failed to create ContentPage FirstPage
mvx:Error: 17,92 Skipping request for FirstViewModel
03-10 10:11:38.904 I/mono-stdout(18964): mvx:Error: 17,92 Skipping request for FirstViewModel
[0:] mvx:Error: 17,92 Skipping request for FirstViewModel`
目前,该项目如下所示:

启动活动

[Activity(Label = "Hello MvvmCrossForms", Icon = "@drawable/icon", MainLauncher = true)]
public class CrossFormsApp : FormsApplicationActivity
{
    private MvxAndroidLifetimeMonitor _lifeTimeMonitor;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        Forms.Init(this, bundle);

        InitialiseMvx();

        var mvxFormsApp = new MvxFormsApp();
        var presenter = Mvx.Resolve<IMvxViewPresenter>() as MvxFormsDroidPagePresenter;

        presenter.MvxFormsApp = mvxFormsApp;
        LoadApplication(mvxFormsApp);
        Mvx.Resolve<IMvxAppStart>().Start();

        _lifeTimeMonitor = Mvx.Resolve<IMvxAndroidCurrentTopActivity>() as MvxAndroidLifetimeMonitor;
        _lifeTimeMonitor.OnCreate(this);
    }

    private void InitialiseMvx()
    {
        if (MvxSingleton<IMvxIoCProvider>.Instance == null)
            Mvx.RegisterSingleton(MvxSimpleIoCContainer.Initialize());

        MvxAndroidSetupSingleton.EnsureSingletonAvailable(this.ApplicationContext)
                                .EnsureInitialized();
    }

    protected override void OnStart()
    {
        base.OnStart ();
        _lifeTimeMonitor.OnStart(this);
    }

    protected override void OnRestart()
    {
        base.OnRestart ();
        _lifeTimeMonitor.OnRestart(this);
    }

    protected override void OnResume()
    {
        base.OnResume ();
        _lifeTimeMonitor.OnResume(this);
    }

    protected override void OnDestroy()
    {
        base.OnDestroy ();
        _lifeTimeMonitor.OnDestroy(this);
    }
}
[活动(Label=“Hello MvvmCrossForms”,MainLauncher=true)]
公共类CrossFormsApp:FormsApplicationActivity
{
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
//初始形式
Forms.Init(这个,bundle);
InitialiseMvx();
//创建mvxformsApp
var mvxFormsApp=新的mvxFormsApp();
var presenter=Mvx.Resolve()作为MvxFormsDroidPagePresenter;
//指定viewPresenter
presenter.MvxFormsApp=MvxFormsApp;
LoadApplication(mvxFormsApp);
//启动mvxApp
Mvx.Resolve().Start();
}
私有void InitialiseMvx()
{
if(MvxSingleton.Instance==null)
RegisterSingleton(MvxSimpleIoCContainer.Initialize());
MvxAndroidSetupSingleton.EnsureSingletonAvailable(this.ApplicationContext)
.重新初始化();
}
}
MainViewModel

public interface IXFViewModel
{
}

public class MainViewModel : MvxViewModel, IXFViewModel
{
    private string _inputString;

    public ICommand NavigateCommand
    {
        get { return new MvxCommand(() => Close(this)); }
    }

    public string InputString
    {
        get { return _inputString; }
        set { SetProperty(ref _inputString, value); }
    }
}
public类主视图模型:MvxViewModel
{
私有字符串_inputString;
公共ICommand导航命令
{
获取{返回新的MvxCommand(()=>ShowViewModel());}
}
公共字符串输入字符串
{
获取{return\u inputString;}
set{SetProperty(ref _inputString,value);}
}
}

基本上,我要寻找的是与此相反的内容:

在MvvmCross中,ViewPresenter是处理视图之间导航的组件

所以我们必须创造我们自己的

  • 它继承自
    MvxFormsDroidPagePresenter
    ,因为我们有一个表单应用程序
  • 重定向非形式的调用

    • ChangePresentation
      (通常用于Close()
    • 显示
    处理活动的ViewPresenter(
    MvxAndroidViewPresenter

  • 非表单视图模型的列表(
    \u androidViews
类HybridDroidViewPresenter:MvxFormsDroidPagePresenter
{
私有只读MvxAndroidViewPresenter _androidPresenter;
私有只读列表_androidview;
受保护的活动活动=>Mvx.Resolve().Activity;
公共HybridDroidViewPresenter()
{
_AndroidPresenter=新的MvxAndroidViewPresenter();
_androidViews=新列表
{
类型(FirstViewModel)
};
}
公共覆盖无效ChangePresentation(MvxPresentationHint)
{
if(Activity.GetType()!=typeof(MainActivity))
{
//如果我们不在Forms活动上,我们假设我们在Android活动上
_AndroidPresenter.ChangePresentation(提示);
返回;
}
基础。变更表示(提示);
}
公共覆盖无效显示(MvxViewModelRequest请求)
{
if(_androidViews.Contains(request.ViewModelType))
{
_AndroidPresenter.Show(请求);
返回;
}
显示(请求);
}
}
要注册新的ViewPresenter,我们必须在设置中覆盖
CreateViewPresenter

公共类设置:MvxAndroidSetup
{
// ...
受保护的覆盖IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter=新的HybridDroidViewPresenter();
Mvx.RegisterSingleton(演示者);
返回演讲者;
}
}
我们的ViewPresenter和
MvxAndroidViewPresenter
需要
IMvxAndroidCurrentTopActivity
。因此,我们需要让it部门了解我们的
main活动的生命周期。这可以通过
IMvxAndroidActivityLifetimeListener
完成,并按如下方式修改活动:

[活动(Label=“MainActivity”,ScreenOrientation=ScreenOrientation.grait)]
公开课活动
:表单应用活动
{
私有IMvxAndroidActivityLifetimeListener _lifetimeListener;
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
Forms.Init(这个,bundle);
var mvxFormsApp=新的mvxFormsApp();
LoadApplication(mvxFormsApp);
var presenter=(MvxFormsDroidPagePresenter)Mvx.Resolve();
presenter.MvxFormsApp=MvxFormsApp;
Mvx.Resolve().Start();
_lifetimeListener=Mvx.Resolve();
_lifetimeListener.OnCreate(此);
}
受保护的覆盖无效OnDestroy()
{
_lifetimeListener.OnDestroy(本);
base.ondestory();
}
受保护的覆盖无效Wintent(意图)
{
基恩温特(意图);
_lifetimeListener.OnViewNewIntent(此);
}
受保护的覆盖void OnResume()
{
base.OnResume();
_lifetimeListener.OnResume(此);
}
受保护的覆盖void OnPause()
{
_lifetimeListener.OnPause(此);
base.OnPause();
}
受保护的覆盖void OnStart()
{
base.OnStart();
_lifetimeListener.OnStart(此);
}
受保护的重写void OnRestart()
{
base.OnRestart();
_lifetimeListener.OnRestart(此);
}
受保护的覆盖void OnStop()
{
_lifetimeListener.OnStop(此);
base.OnStop();
}
}
现在,我们可以通过[Activity(Label = "Hello MvvmCrossForms", Icon = "@drawable/icon", MainLauncher = true)] public class CrossFormsApp : FormsApplicationActivity { private MvxAndroidLifetimeMonitor _lifeTimeMonitor; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); Forms.Init(this, bundle); InitialiseMvx(); var mvxFormsApp = new MvxFormsApp(); var presenter = Mvx.Resolve<IMvxViewPresenter>() as MvxFormsDroidPagePresenter; presenter.MvxFormsApp = mvxFormsApp; LoadApplication(mvxFormsApp); Mvx.Resolve<IMvxAppStart>().Start(); _lifeTimeMonitor = Mvx.Resolve<IMvxAndroidCurrentTopActivity>() as MvxAndroidLifetimeMonitor; _lifeTimeMonitor.OnCreate(this); } private void InitialiseMvx() { if (MvxSingleton<IMvxIoCProvider>.Instance == null) Mvx.RegisterSingleton(MvxSimpleIoCContainer.Initialize()); MvxAndroidSetupSingleton.EnsureSingletonAvailable(this.ApplicationContext) .EnsureInitialized(); } protected override void OnStart() { base.OnStart (); _lifeTimeMonitor.OnStart(this); } protected override void OnRestart() { base.OnRestart (); _lifeTimeMonitor.OnRestart(this); } protected override void OnResume() { base.OnResume (); _lifeTimeMonitor.OnResume(this); } protected override void OnDestroy() { base.OnDestroy (); _lifeTimeMonitor.OnDestroy(this); } }
public interface IXFViewModel
{
}

public class MainViewModel : MvxViewModel, IXFViewModel
{
    private string _inputString;

    public ICommand NavigateCommand
    {
        get { return new MvxCommand(() => Close(this)); }
    }

    public string InputString
    {
        get { return _inputString; }
        set { SetProperty(ref _inputString, value); }
    }
}