这与another question I posted有关,但可能需要保证。{3}}。
我需要能够从其相关的Android视图中执行ViewModel中的Command,特别是在单击Action Bar菜单项时。因此,首先我需要访问ViewModel的实例。
首先,我在查看的OnCreateOptionsMenu(IMenu menu)
方法中尝试了以下代码行:
NewJobViewModel newJobViewModel = Mvx.Resolve<NewJobViewModel>();
然而,这导致错误:"UNHANDLED EXCEPTION: Cirrious.CrossCore.Exceptions.MvxException: Failed to resolve type MyProject.Core.ViewModels.NewJobViewModel"
然后我尝试了这个:
[Activity]
public class NewJobView : MvxActivity {
private NewJobViewModel _newJobViewModel;
public NewJobViewModel NewJobViewModel {
get { return _newJobViewModel; }
set { _newJobViewModel = value; }
}
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
SetContentView(Resource.Layout.NewJobView);
this.NewJobViewModel = Mvx.Resolve<NewJobViewModel>();
}
}
......没有帮助。
但是,将以下内容添加到Apps.cs
会导致错误,但会导致其他问题,因为它显然没有给我相同的ViewModel实例,MvvmCross框架必须已在后台初始化(?):
public override void Initialize() {
CreatableTypes()
.EndingWith("NewJobViewModel")
.AsTypes()
.RegisterAsSingleton();
}
我明显误解了一些架构以及后台发生的事情(所以如果这是一个基本问题,我道歉)但有人可以告诉我我做错了吗?
答案 0 :(得分:4)
MvvmCross会自动为您View
和ViewModel
发送电子邮件。
这在调用base.OnCreate(bundle);
如果您想在视图中访问ViewModel
,可以使用ViewModel
属性执行此操作。
但是,由于ViewModel
属性是在共享基类中定义的,因此它的类型为IMvxViewModel
要获得键入的ViewModel
,您只需将其转换为特定类型即可 - 例如
var myTypedView = (MyTypedViewModel)ViewModel;
你绝对不想创建一个新的viewmodel(这是Mvx.Resolve<NewJobViewModel>()
试图做的事情) - 而只是想要访问当前的那个。