MVVM + WPF - Дизайн для ViewModel с несколькими представлениями - PullRequest
0 голосов
/ 05 октября 2018

Я разрабатываю приложения .NET / Winforms, которые работают в различных киосках.Эти приложения обычно являются полноэкранными и сенсорными.Недавно я хотел бы использовать технологию WPF и шаблон проектирования MVVM.

Жизнеспособным дизайном этих приложений является то, что у меня есть одна MainForm (Window), которая переключает экраны (UserControls) на нем.Таким образом, у вас есть только один «текущий» экран с кнопками, такими как «Предыдущая», «Следующая» (как в мастере).

Большинство приложений имеют очень похожую логику.Они например.необходимо получить OrderNumber (PIN-код, любой текст ..) от пользователя (один экран), обработать платеж картой (второй экран), ... Что отличается в разных приложениях, так это графический интерфейс: изображения, шрифты, цвета, разрешения монитора, расположение кнопок,...

Моя идея - написать типичные ViewModels и поместить их в общую библиотеку.Определенные приложения затем предоставят свои представления для этих моделей представления.Каждая модель представления будет привязана к одному конкретному представлению в течение всего срока службы приложения.

Пример:

Библиотека Common.dll

  • содержит типичные модели представления: ScreenGetTextViewModel, ScreenPayByCardViewModel, ...
    • (содержит также представления по умолчанию для моделей представления)

Приложение 1:

  • ссылки Common.dll
  • содержит представления для клиента 1: ScreenGetTextView, ScreenPayByCardView, ... (эти представления связаны с ViewModels из Common.dll)

Приложение 2:

  • ссылки Common.dll
  • содержит представления для клиента 2: ScreenGetTextView, ScreenPayByCardView, ... (эти представленияпривязаны к ViewModels из Common.dll)

MVVM выглядит для меня как правильный путь для достижения моих требований из-за логики и разделения GUI.

Мой вопрос: как сделать это в WPF, что использовать, где вдохновлять себя.Я предпочитаю простые решения без сторонних инструментариев MVVM (если это разумно и возможно).

Некоторые подвопросы / идеи:

  • Как указать, какое представление должно привязываться к конкретной модели представления?Использовать какой-нибудь ViewLocator?Поместить свойство View в ViewModel?

  • Я предпочитаю писать Common.dll, не связанный с WPF, из-за возможных приложений UWP в будущем (если это возможно).

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

В MVVM-сценарии вы обычно ссылаетесь на модель представления в коде XAML представления как на текстовый текст.Таким образом, нет проблемы, если два экземпляра вашего класса viewmodel вызываются двумя разными представлениями.Использование локатора представлений имеет смысл, если вам нравится слабая связь для модульного тестирования.

, если ваш common.dll содержит только модели представления, он не должен быть связан с вашими WPF-представлениями.В противном случае вы нарушили MVVM-шаблон.

Будучи относительно новичком в MVVM и имея ограничение не брать фреймворк, я все равно получил удовольствие от курса Лорана Буньона по MVVMLight по Pluralsight (у вас может быть бесплатная 3-месячная подписка в вашей лицензии MSDN): https://www.pluralsight.com/courses/mvvm-light-toolkit-fundamentals

Я также часто заглядывал в код MVVMLight, чтобы понять некоторые реализации сервисов: https://github.com/lbugnion/mvvmlight/

Для второго проекта я бы сразу использовал MVVMLight, поскольку он с открытым исходным кодом.но для первого проекта было хорошо почувствовать боль и понять, почему MVVMLight (и другие фреймворки) принимают определенные повороты.

надеюсь, что это поможет!

0 голосов
/ 05 октября 2018

Я когда-либо видел только одно представление на ViewModel - поэтому мне было бы интересно, есть ли другой способ сделать это.

Я бы сделал это с ViewModel для каждого представления, но каждый ViewModel наследуетиз общей ViewModel.

Таким образом, Common.dll будет содержать ScreenPayByCardView, а Приложение 1 будет содержать App1ScreenPayByCardView, который наследуется от ScreenPayByCardView.Возможно, эта ViewModel может даже не содержать собственной логики.

...