2013-06-10 1 views
1

Я изо всех сил стараюсь найти правильный способ сделать это. У меня есть MyCollectionViewModel, который содержит наблюдаемые коллекции MyViewModel. У меня есть привязка к виду MyCollectionView с выбором элемента, связанного обратно с командой в MyCollectionViewModel под названием OpenMyViewCommand. До сих пор так хорошо:Открыть Просмотреть выбранный ViewModel

private MvxCommand<MyViewModel> _openMyViewCommand; 
    public ICommand OpenMyViewCommand 
    { 
     get { 
      _openMyViewCommand= _openMyViewCommand?? new MvxCommand<MyViewModel>(OpenMyView); 
      return _openSubViewCommand; 
     } 
    } 

Теперь, когда я прикасаюсь один из пунктов моего списка просмотр будет срабатывать команду и вызвать метод OpenMyView проходящий выбранный MyViewModel к методу. Теперь проблема в том, что независимо от того, что я пытаюсь, я могу показать ShowViewModel, чтобы отобразить представление для выбранной модели. Я пробовал различные вещи, но интуитивно, я бы ожидал чего-то очень простое, как это работает:

private void OpenMyView(MyViewModel item) { 
       ShowViewModel<MyViewModel > (item); 
    } 

Но, конечно, это не так. Я получаю ошибки, которые выглядят так:

013-06-10 10:46:05.849 MyAppIPhoneUI[51198:c07] mvx: Warning: 5.83 Problem creating viewModel of type MyViewModel - problem MvxException: Failed to resolve parameter for parameter model of type MyModel when creating MyApp.Core.MyViewModel 
at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.GetIoCParameterValues (System.Type type, System.Reflection.ConstructorInfo firstConstructor) [0x00042] in /MvvmCross-3/CrossCore/Cirrious.CrossCore/IoC/MvxSimpleIoCContainer.cs:377 
at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct (System.Type type) [0x00030] in /MvvmCross-3/CrossCore/Cirrious.CrossCore/IoC/MvxSimpleIoCContainer.cs:266 
at Cirrious.CrossCore.Mvx.IocConstruct (System.Type t) [0x00006] in /MvvmCross-3/CrossCore/Cirrious.CrossCore/Mvx.cs:115 
at Cirrious.MvvmCross.ViewModels.MvxDefaultViewModelLocator.TryLoad (System.Type viewModelType, IMvxBundle parameterValues, IMvxBundle savedState, IMvxViewModel& viewModel) [0x00004] in /MvvmCross-3/Cirrious/Cirrious.MvvmCross/ViewModels/MvxDefaultViewModelLocator.cs:27 

013-06-10 10:24:11.330 MyAppIPhoneUI[50878:c07] mvx: Warning: 6.87 Exception masked MvxException: Failed to load ViewModel for type MyApp.Core.MyViewModel from locator MvxDefaultViewModelLocator 
    at Cirrious.MvvmCross.ViewModels.MvxViewModelLoader.LoadViewModel (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest request, IMvxBundle savedState, IMvxViewModelLocator viewModelLocator) [0x00023] in /MvxViewModelLoader.cs:46 

Любая идея, что здесь происходит? У меня есть класс MyView, который наследуется от MvxViewController, но он не загружается.

ответ

1

Навигация осуществляется с помощью таких вещей, как Android Intent s и WindowsPhone Uri s - так это должно быть сделано с помощью сериализуемых типов - см:

Попробуйте изменить код на код:

ShowViewModel<MyViewModel>(new { id = item.Id }); 

с приемной MyViewModel как:

public void Init(int id) 
    { 
    MyItem = myItemLookupService.Lookup(id);  
    } 

Кроме того, имейте в виду, что у вас есть очень мало контроля над жизненным циклом вашего приложения - это может получить «захоронены» в любой момент. Поэтому не ожидайте, что только потому, что MyViewModel получает навигационный запрос, тогда элемент для этого запроса всегда будет в памяти - вам может понадобиться создать или получить его снова и снова.

+0

Спасибо Стюарт. Я переделал его так же, как и часть 4-го сбора, и, похоже, он работает, но это похоже на долгий путь. Но я думаю, что ваша точка зрения о жизненном цикле - это то, что мне нужно прочитать еще. –