2013-07-02 64 views
2

这与another question I posted有关,但可能需要自行解决。MvvmCross - 无法解析ViewModel的类型

我需要能够在我的ViewModel中从其相关的Android视图执行一个命令,特别是当单击一个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治愈的错误,但导致其他的问题,因为它显然没有给我说MvvmCross框架必须在后台已经初始化视图模型的同一个实例(?):

public override void Initialize() { 
    CreatableTypes() 
     .EndingWith("NewJobViewModel") 
     .AsTypes() 
     .RegisterAsSingleton(); 
} 

我明显误解了一些架构和发生在后台的事情(所以我很抱歉如果这是一个基本问题),但有人可以告诉我我做错了什么吗?

回答

4

MvvmCross会自动连线您的ViewViewModel

这会自动调用base.OnCreate(bundle);

期间如果你想你的视图中访问您的ViewModel你可以做到这一点使用ViewModel财产发生。

然而,由于ViewModel属性在共享的基类中定义,它的类型为IMvxViewModel

为了得到一个类型ViewModel你可以简单地将它转换为特定类型 - 例如

var myTypedView = (MyTypedViewModel)ViewModel; 

你肯定不希望创建一个新的视图模型(这是Mvx.Resolve<NewJobViewModel>()试图做什么) - 而不是你只是想访问当前之一。

+0

感谢那个Stuart,它解决了我的问题,现在我已经设法将Action Bar的click事件连接到ViewModel中的命令。 PS:我发现你的N + 1视频系列是学习MvvmCross的绝佳方式。保持伟大的工作:-)格雷厄姆。 – Graham

+0

但是,如何使用带有一些子视图模型的HomeViewModel的选项卡视图等场景,每个选项卡都有一个。你是否新增了每个子视图模型,并将所有依赖项传递给HomeViewModel?为什么不在HomeViewModel构造函数中使用Mvx.Resolve? –