2013-07-02 2 views
2

Это связано с another question I posted, но, вероятно, гарантирует его.MvvmCross - Не удалось решить тип для ViewModel

Мне нужно иметь возможность выполнить команду в моей модели ViewModel из связанного с ней вида Android и, в частности, при нажатии элемента меню «Панель действий». Поэтому, прежде всего, мне нужен доступ к экземпляру 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(); 
} 

Я четко понимаю неправильную архитектуру и то, что происходит в фоновом режиме (поэтому я извиняюсь, если это основной вопрос), но может ли кто-нибудь рассказать мне, что я делаю неправильно?

ответ

4

MvvmCross автоматически соединяет ваши View и ViewModel для вас.

Это происходит автоматически во время вызова base.OnCreate(bundle);

Если вы хотите получить доступ к ViewModel в вашем View вы можете сделать это с помощью ViewModel свойства.

Однако, поскольку свойство ViewModel определяется в общем базовом классе, это типа IMvxViewModel

Чтобы получить набранный ViewModel вы можете просто бросить его к определенному типу - например,

var myTypedView = (MyTypedViewModel)ViewModel; 

Вы определенно не хотите, чтобы создать новый ViewModel (что Mvx.Resolve<NewJobViewModel>() пытается сделать) - вместо этого вы просто хотите получить доступ к текущей.

+0

Спасибо за это Стюарт, он решил мою проблему, и теперь мне удалось подключить событие click панели действий к команде в моей модели ViewModel. PS: Я нашел ваш сериал N + 1 фантастическим способом узнать MvvmCross. Продолжайте отличную работу :-) Грэм. – Graham

+0

Но как насчет сценариев, таких как представление вкладки, с HomeViewModel, который имеет некоторые модели просмотра для детей, по одному для каждой вкладки. Вы новичок в каждой модели детского просмотра и передаете все зависимости в HomeViewModel? Почему бы не использовать Mvx.Resolve в конструкторе HomeViewModel? –

Смежные вопросы