MvvmCross:混合Xamarin.表单和Android活动应用程序
作为MvvmCross的新手,我决定创建一个小的Xamarin.Forms应用程序。我有一个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-
MainPage.xaml
绑定到它的ViewModelMainViewModel.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
- 重定向非形式的调用
(通常用于Close()ChangePresentation
显示
)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); }
}
}