Arhn - архитектура программирования

создать или внедрить ViewModel при создании приложения вкладок

Мы пытаемся создать приложение с несколькими вкладками. В качестве эталонного проекта мы используем этот пример: http://slodge.blogspot.co.uk/2013/06/n25-tabs-n1-days-of-mvvmcross.html

Чтобы получить экземпляры ViewModel, необходимые для создания вкладок, мы использовали шаблон «HomeViewModel», как указано в этом сообщении: Создать модель представления с помощью MVVMCross, встроенного в factory?

Что мне не нравится в этом подходе, так это инициализация ViewModel с помощью «нового». Насколько я понимаю, он пропускает весь ViewModel-Lifecycle (https://github.com/slodge/MvvmCross/wiki/View-Model-Lifecycle), который нам очень нравится. В нашем текущем проекте мы хотели бы использовать метод жизненного цикла «start()», но он никогда не вызывается из-за инициализации с «новым».

Что сработало для нас, так это пойти таким путем:

var loaderService = Mvx.Resolve<IMvxViewModelLoader>(); 
var vm = (UserListViewModel)loaderService.LoadViewModel(new MvxViewModelRequest(typeof(UserListViewModel), null, null, null), null);

Итак, мой вопрос: это способ выполнить работу или это просто грязный обходной путь, и есть гораздо лучшее решение?

Обновление: мы пришли к такому решению:

CreateTabFor<SettingsViewModel>("Settings", "settings");
//This method loads the ViewModel
private UIViewController CreateTabFor<TTargetViewModel>(string title, string imageName)  
    where TTargetViewModel : class, IMvxViewModel
{
    var controller = new UINavigationController();
    controller.NavigationBar.TintColor = UIColor.Black;

    var viewModelRequest = new MvxViewModelRequest(typeof(TTargetViewModel), null, null, null);
    var screen = this.CreateViewControllerFor<TTargetViewModel>(viewModelRequest) as UIViewController;
    SetTitleAndTabBarItem(screen, title, imageName);
    controller.PushViewController(screen, false);
    return controller;
}

  • Я думаю, вы также можете использовать MvxViewModelRequest<TViewModel>.GetDefaultRequest(), если это поможет 18.07.2013
  • Я сейчас тоже смотрю на вкладки в iOS. Является ли CreateViewControllerFor причиной создания и привязки View и ViewModel для каждой вкладки еще до того, как они будут выбраны? 08.05.2015

Ответы:


1

«Жизненный цикл модели представления» — это область противоречивых интересов в MvvmCross. Основной причиной является конфликт между:

  • viewmodel, которые являются просто моделями для любого представления
  • модели представления, которые специально используются в процессе навигации ShowViewModel.

Жизненный цикл модели представления C-I-R-S для простого взаимодействия с пользователем «всю страницу» легко поддерживать и обеспечивать его последовательное использование.

Однако, как только пользовательский интерфейс начинает объединяться во вкладках, всплывающих окнах, гамбургер-меню, диалоговых окнах, разделенных представлениях и т. д., тогда:

  1. разработчики иногда хотят сами контролировать жизненные циклы модели представления
  2. для фреймворка не так просто обеспечить постоянное создание, активацию и последовательное захоронение/регидратацию моделей представлений.

Лично мне нравится ваш подход — попытка гарантировать, что все модели представления независимы и построены одинаково, — но MvvmCross не навязывает этот подход всем разработчикам.

В частности, для вкладок в большинстве существующих примеров используется шаблон «собственной подпрограммы представления», который вы определили.

Тем не менее, если вы хотите, должно быть относительно легко реализовать другие механизмы - так же, как вы уже это сделали.

В частности, вы можете:

  • использовать loaderService напрямую - получить его через Mvx.Resolve<IMvxViewModelLoader>();
  • используйте ShowViewModel с пользовательским презентатором для создания как представлений, так и моделей представлений. of-mvvmcross.html" rel="nofollow noreferrer">N=25 видео, но вы можете пойти гораздо дальше и фактически добавить вкладки в ответ на вызовы ShowViewModel.
  • используйте альтернативные вызовы для создания дочерних вкладок и их моделей представления внутри представлений - например. где образец Touch в настоящее время вызывает

       var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
    

    это можно легко заменить чем-то вроде:

       var screen = this.CreateViewControllerFor<ChildViewModel>() as UIViewController;;
    

    (или одна из других перегрузок из MvxCanCreateIosViewExtensionMethods.cs)

Один репозиторий, где, как я знаю, некоторые пользователи взяли некоторые из этих идей и поэкспериментировали с ними, — это Репозиторий скользящего меню — я думаю, что они решили использовать this.CreateViewControllerFor<TViewModel> для создания своих моделей представления. Это может быть или не быть тем путем, который вы выберете, но вам может быть интересно поэкспериментировать.

18.07.2013
  • спасибо за ваш подробный ответ! Я изменил свой код с вашим ответом. 18.07.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..