Лучшая практика для вызова View из ViewModel в WPF

Я ищу небольшой пример проекта wpf, в котором содержится лучшая практика для навигации между представлениями. Может быть, с фреймворком MVVM Light и NavigationService или ServiceLocator. Вместо того, чтобы вызывать View из ViewModel, как вы это делаете? Как твой подход? У вас есть пример проекта?

2 ответа

Решение

Я предпочитаю иметь главное окно с контролем контента. За этим стоит модель представления со свойством состояния приложения на основе общего перечисления.

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

Используя селектор шаблона, связанный с этим свойством, я управляю представлением, представленным в элементе управления содержимым в моем главном окне.

Этот подход требует, чтобы вы управляли селектором шаблона с помощью свойств шаблона для каждого значения перечисления или представления, которое вы хотите использовать в качестве основного содержимого. Но шаблон должен включать только экземпляр вашего представления, поэтому минимальный XAML.

В фоновом режиме я использую MVVM light для предоставления источника данных локатора Viewmodel, что делает мои представления действительно простыми для создания экземпляров. Они также используют одноэлементную модель представления, поэтому состояние управляется между использованиями. Затем я также использую инфраструктуру обмена сообщениями для отправки сообщений в мою модель представления основного окна, сообщая, какое состояние мне сейчас нужно. Это означает, что любая модель представления может опубликовать сообщение для переключения в другое состояние, не зная, каким будет это представление, но в конечном счете модель представления главного окна управляет этим переходом.

Приносим извинения за отсутствие примеров кода, вот краткое изложение того, что я делал несколько раз, но у меня нет чистого примера, которым можно поделиться.

Надеюсь, этого достаточно, чтобы объяснить мой подход, но не стесняйтесь комментировать, если это не имеет смысла или не соответствует тому, что вы пытаетесь сделать.

Для диалогов... Обычно у меня есть диалоговые окна по умолчанию, которые я использую повторно, но можно использовать тот же принцип. Вместо того, чтобы быть главным оконным элементом управления и виртуальной машиной, есть дополнительный для диалоговых окон, который работает так же, но делает себя видимым в соответствии с запросом и закрывается после завершения. Снова Mvvm Light Messenger ваш друг здесь.

Ваше сообщение включает в себя диалоговое окно "Состояние", которое контролирует представленный вид.

Это будет работать только в том случае, если ваш дизайн будет разрешать только один диалог за раз.

Наконец, для вкладок...

Я бы посмотрел на наличие наблюдаемой коллекции перечисления состояний в модели основного вида. Затем создайте вкладки, привязав к этому. Не то, что я сделал, но это то, с чего я бы начал. -

Я предпочитаю ViewModel первый подход. Это означает, что навигационная служба принимает viewmodel в качестве параметра, а затем, в соответствии с соглашением об именах, создается экземпляр view и загружается во фрейм.

navigationService.Navigate<SomePageViewModel>()

Это имеет несколько преимуществ по сравнению с навигацией на основе URI, которая представляет собой первый подход:

  • Лучшая тестируемость
  • возможность внедрения зависимости
  • самое важное: лучшая ремонтопригодность. Если вы переименуете или переместите свои страницы, это не скомпилируется, пока вы не исправите это, в отличие от URI. Ури выдаст ошибку во время выполнения

К сожалению, я не могу дать вам мой пример проекта прямо сейчас, но это довольно легко реализовать свой собственный

Другие вопросы по тегам