2013-07-02 92 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? –