Как правильно организовать кросс-контекстные фичи, чтобы они укладывались в MVVM подход без дублирования кода?

Предположим у меня есть две связанные сущности. Допустим, ученик и учебный класс класс.
Ученик агрегирует у себя класс, но классы не знают об учениках.

Так же у нас есть две страницы:
1. Страница с управлением классами
2. Страница с управлением учениками

На данных страницах предусмотрен следующие userflow:
Страница с классами:
  1. Пользователь находится на странице классов и видит пагинированный список уже существующих классов, кнопку создания класса.
    Рядом с элементом списка есть кнопки редактировать класс, посмотреть подробности о классе.

  2. Пользователь нажимает кнопку создания открывает диалоговое окно в режиме создания, в котором имеется:
    • Заголовок
    • Форма
    • Кнопки "Сохранить" и "Отмена"
      • Пользователь нажимает на кнопку отмена и диалог закрывается
      • Пользователь нажимает сохранить и, если, класс сохранился, то диалог переходит в режим просмотра
        1. Мы показываем пользователю всплывашку (popup) с сообщением, что класс сохранён
        2. Диалоговое окно меняет заголовок на название класса
        3. Форма блокируется скрывая некоторые поля и служит только для просмотра
        4. Кнопки "Сохранить" и "Отмена" меняются на "Редактировать", "Копировать" и "Закрыть"
          1. Мы показываем пользователю всплывашку (popup) с сообщением, что класс сохранён
          2. Диалоговое окно меняет заголовок на название класса
          3. Форма блокируется скрывая некоторые поля и служит только для просмотра

          4. Кнопки "Сохранить" и "Отмена" меняются на "Редактировать", "Копировать" и "Закрыть"
            1. Пользователь жмёт "Закрыть" и диалоговое окно закрывается
            2. Пользователь жмёт "Копировать" и диалоговое окно возвращается к состоянию создания класса
            3. Пользователь жмёт "Редактировать", форма переходит в режим редактирования
              1. Форма разблокируется, показывает поля, которые были скрыты в режиме просмотра
              2. Кнопки "Редактировать", "Копировать" и "Закрыть" меняются на "Сохранить" и "Отмена"
                1. Пользователь жмёт "Сохранить", обрабатывается сохранение и в случае успеха диалог переходит в режим просмотра
                2. Пользователь жмёт "Отмена", диалог переходит в режим просмотра

  3. Пользователь нажимает кнопку редактирования рядом с элементом списка и открывается диалоговое окно в режиме редактирования, flow которого описан выше
  4. Пользователь нажимает кнопку просмотра рядом с элементом списка и открывается диалоговое окно в режиме просмотра, flow которого описан выше
  5. Пользователь нажимает кнопку удалить и элемент удаляется


Страница с учениками предполагает схожий flow с одним нюансом:
В диалоговом окне во время редактирования или создания ученика в форме у нас есть выбор класса а так же кнопка создания нового класса, на случай, если пользователь не нашел нужный класс. и при нажатии на кнопку создания класса предполагается, что будет открыт диалог, который мы видели ранее на странице создания класса со всеми его возможностями. При этом, если пользователь создал класс, то хотелось бы, чтобы этот класс сразу подставился в поле выбора класса.

Я пытался сделать это с помощью ReactiveUI и реактивных команд (у которых можно подписаться на результат, но выглядит это костыльно.
Нужно делать либо две VM, одна из которых уже будет отвечать за возможности управления контекстом (CRUD с сущностью и при любом действии из команды возвращать VM сущности и уже там подписываться на CancelCreate/CancelUpdate/SubmitCreate и т.д. команды) и с помощью attached behavior уже манипулировать view.
Либо пропихивать IDialogService в VM, что уже делает её не VM, а смесью VM + Presenter какой-то
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы