2

这与我发布的另一个问题有关,但可能需要它自己。

我需要能够从其相关的 Android 视图中执行我的 ViewModel 中的命令,特别是在单击操作栏菜单项时。因此,首先我需要访问 ViewModel 的实例。

首先,我在ViewOnCreateOptionsMenu(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 框架必须已经在后台初始化的相同 ViewModel 实例(?):

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

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

4

1 回答 1

4

MvvmCross 会自动为您连接View和连接ViewModel

这在调用期间自动发生base.OnCreate(bundle);

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

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

要获得类型ViewModel,您可以简单地将其转换为您的特定类型 - 例如

 var myTypedView = (MyTypedViewModel)ViewModel;

您绝对不想创建一个新的视图模型(这是Mvx.Resolve<NewJobViewModel>()试图做的)——相反,您只想访问当前的视图模型。

于 2013-07-02T16:38:22.497 回答