0

Нужно реализовать грамотную связь между множеством ViewModel, какие есть наилучшие варианты реализации?

Существует 2 основные ViewModel:

Одна ViewModel осуществляет поиск по базе данных и отображение данных в ListBox.

Вторая ViewModel - это TabItem.

Связь между ними простая: при нажатии на элемент ListBox необходимо передать id элемента (каждый элемент - клиент, у которого есть id и другие данные) или передать элемент целиком, пока ещё не определился.

Вторая ViewModel принимает данный id или класс и добавляет его в коллекцию. Каждый элемент этой коллекции - отдельный TabItem.

Далее, внутри каждого TabItem есть основная ViewModel, которая будет показывать содержимое TabItem по некоторому условию. У каждого содержимого есть своя ViewModel.

Далее каждый уровень - это отдельная ViewModel.


1 уровень:

ViewModel для окна с просмотром некоторой информации по базе данных в целом (Отчет за период). Внутри больше нет моделей.

ViewModel добавления/редактирования информации о клиенте. Имя, Фамилия, номер телефона и список его автомобилей.


2 уровень:

ViewModel добавления/редактирования информации о выбранном автомобиле из списка автомобилей клиента уровнем выше. Марка, производитель, номер авто, список визитов данного автомобиля в сервис и т.д.


3 уровень:

ViewModel добавление/редактирования информации о выбранном визите из списка визитов автомобиля клиента уровнем выше.


Больше уровней нет.

Необходимо грамотно продумать связь между ViewModel. Какие есть лучшие варианты? Можете показать подобные примеры или скинуть ссылку на примеры реализации?

Буду благодарен, спасибо!

  • Путаница. ListBox или TabItem не могут иметь отношение к View Model, так как это View слой. Вопрос в целом на воображение, я с ходу не могу понять, что у вас там происходит. Быть может стоит написать воспроизводимый пример? Что такое "связь" в вашем понимании? Зачем она? – aepot Nov 02 '23 at 16:25
  • Передавать информацию между моделями, чтобы изменять те или другие свойства – Андрей Шутов Nov 02 '23 at 16:32
  • Например - нажали на ListItem - открылся TabItem с информацией. При этом, ListBox находится в SearchPageViewModel, а TabItem находится в другой модели (не помню уже название) – Андрей Шутов Nov 02 '23 at 16:33
  • Разные потребности решаются по-разному. Но в целом решение - ссылка на экземпляр нужной вьюмодели. Меню что-ли у вас там? – aepot Nov 02 '23 at 16:33
  • Singleton не лучший вариант. Думаю использовать Service, а другие модели будут подписаны на него, но не знаю как правильно реализовать – Андрей Шутов Nov 02 '23 at 16:35
  • Оно? Ну или почитайте про шаблон проектирования IoC (инверсия управления). – aepot Nov 02 '23 at 16:36
  • Лучший вариант - использование Prism и его регионов. При клике по списку вы будете делать навигацию во втором регионе(там ваши более подробные данные) и перед этим передавать во ViewModel ваш id или другие данные. Не нравится Prism - сделайте Service, в котором будете хранить выделенный элемент. Зарегистрируйте его в контейнере как Singleton и используйте в каждой VM. – Lapish Nov 02 '23 at 16:39
  • Здесь можно посмотреть примеры. https://github.com/PrismLibrary/Prism-Samples-Wpf – Lapish Nov 02 '23 at 16:41
  • @Lapish Prism для больших проектов – aepot Nov 02 '23 at 16:41
  • https://www.youtube.com/live/AkJ52O3cgi0?si=Bd7m_yvcGAiuVz7K

    Нашел такое видео, попробую посмотреть.

    – Андрей Шутов Nov 02 '23 at 16:42
  • @aepot а что мешает его использовать для небольших проектов? В нем уже есть 2 DI-контейнера(что нужно автору), а сконфигурировать его для своих задач - дело пары минут. – Lapish Nov 02 '23 at 16:44
  • @Lapish ничего не мешает. Я за то чтобы учиться руками пилить код, а уже потом переходить на библиотеки размером с 3 проекта. Автор не знает, что такое DI. – aepot Nov 02 '23 at 16:47
  • @Lapish, как правильно реализовать через Service, можете написать простой пример ? – Андрей Шутов Nov 02 '23 at 16:51
  • @АндрейШутов да, сейчас подготовлю. – Lapish Nov 02 '23 at 17:25
  • @Lapish, спасибо Вам большое!!! – Андрей Шутов Nov 02 '23 at 17:48
  • @АндрейШутов https://github.com/Lapish/ExampleVMCommunication Базовый способ, но для понимания думаю пойдет. – Lapish Nov 02 '23 at 18:13
  • @Lapish, у меня используется в app Microsoft.Extensions.DependencyInjection и Microsoft.Extensions.Hosting. Они вместе могут взаимодействовать? – Андрей Шутов Nov 02 '23 at 18:51
  • @АндрейШутов Microsoft.Extensions.Hosting вам явно не нужно. Вы можете подключить любой DI-контейнер. Я использовал DryIoc, но их очень много. Раньше(не знаю как сейчас) очень популярным был Unity. Если не хотите подключать DI или пока не получается, то просто сделайте ваш класс singleton'ом через паттерн https://metanit.com/sharp/patterns/2.3.php – Lapish Nov 02 '23 at 19:00
  • @АндрейШутов если не используете, то советую MaterialDesignXAML библиотеку. Это material-стиль для wpf приложения. Но самое главное - возможность легкого создания одностраничного приложения с помощью DialogHost. Т.е, вы можете не создавать новое окно, а внутри вашего единственного окна выводить что-то поверх. Можете скачать DemoApp и во вкладке Dialogs посмотреть, что я имею ввиду. – Lapish Nov 02 '23 at 20:50

0 Answers0