MvvmCross - 无法解析ViewModel的类型

时间:2013-07-02 13:26:13

标签: xamarin.android xamarin mvvmcross

这与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();
}

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

1 个答案:

答案 0 :(得分:4)

MvvmCross会自动为您ViewViewModel发送电子邮件。

这在调用base.OnCreate(bundle);

期间会自动发生

如果您想在视图中访问ViewModel,可以使用ViewModel属性执行此操作。

但是,由于ViewModel属性是在共享基类中定义的,因此它的类型为IMvxViewModel

要获得键入的ViewModel,您只需将其转换为特定类型即可 - 例如

 var myTypedView = (MyTypedViewModel)ViewModel;

你绝对不想创建一个新的viewmodel(这是Mvx.Resolve<NewJobViewModel>()试图做的事情) - 而只是想要访问当前的那个。