Действительно ли MVVM полезен?

Я прочитал статью MSDN о MVVM, и я действительно не уверен. Если модель уже реализует INotifyPropertyChanged/INotifyCollectionChanged, что неправильно с привязкой View непосредственно к модели? Кажется, что дополнительный ModelView вводит некоторый код без особой пользы. Я что-то пропустил?

Ответы

Ответ 1

Я тоже немного скептически относился к MVVM, пока я не посмотрел эту Джейсона Долинджера. Я рекомендую всем моим коллегам, которые начинают работать в WPF и MVVM, чтобы посмотреть его.

Джейсон начал с приложения, которое можно было бы написать в "традиционном" способом, с нажатием кнопок, обрабатываемых обработчики событий в коде, которые затем обновил другие части пользовательского интерфейса. Использование привязки данных WPF, команд и Единство, он трансформировал его, кусочек кусок, в гораздо более управляемый, инкапсулированный, читаемый и проверяемый Конструкция M-V-VM. Это было потрясающе.

Чтобы ответить на ваш вопрос более прямо, даже если кажется, что вам неловко привязываться к ViewModel, когда у вашей модели уже есть все, вам часто приходится очень мало настраивать модель, которая нужна только для представления. Со временем эти небольшие изменения будут ползти в ваши Модели, где они не принадлежат. Это сделает ваши модели более сложными, чем они должны быть.

Что я часто делаю, когда у меня есть модель, которая "имеет все это", я добавляю ViewModel, который содержит одно свойство - Модель. Затем в моих привязках я просто привязываюсь к Model.Name, Model.Age и т.д. Это действительно никаких усилий. Позже, если мне нужны настройки только для представления, у меня уже есть класс ViewModel. Это также делает ваш код более понятным и понятным. Вы не будете удивляться, привязали ли я к модели или ViewModel в этом случае? Это всегда будет ViewModel.

Ответ 2

INotifyPropertyChanged и INotifyCollectionChanged не являются единственными аспектами, которые следует учитывать... Во многих случаях данные, отображаемые моделью, не могут быть легко использованы в представлении. Роль ViewModel заключается в том, чтобы выступать в качестве адаптера между моделью и представлением: выставлять данные в форме, которая позволяет объекту легко связываться с ним, выставлять команды, с которыми может связываться представление, чтобы выполнять действия... Как правило, модель не выставляет ICommand: если это так, то модель является специфичной для WPF, что никогда не очень хорошо, вы хотите повторно использовать в каком-то другом приложении, отличном от WPF...

Я использую MVVM в течение нескольких месяцев, и это облегчило мою жизнь: больше не "код спагетти" в файлах с кодом, четкое разделение обязанностей, чистая общая архитектура...

Ответ 3

Я использовал MVVM для двух проектов, и вот несколько вещей, которые я делал в ViewModel:

  • Преобразование данных из модели (когда вы используете ViewModel, это облегчает жизнь при изменении спецификаций пользовательского интерфейса, вам не нужно менять код Model/Persistence)
  • Реализация ICollectionView над коллекцией, предоставляемой моделью
  • Реализация команд
  • Кэширование (поддерживать дорогостоящий расчет данных)
  • Поддержание словаря по данным модели (для быстрого поиска)
  • Lazy-load (не загружается, пока не будет использоваться View)
  • Управление отменой/повторением
  • Проверка данных (IDataErrorInfo)

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

Не забывайте, что ViewModel позволяет вам unit test вещи, которые вы не сможете проверить, если они были реализованы в пользовательском интерфейсе (например, в командах).

Наконец, используя MVVM, я смог легко создать версию приложения из командной строки с помощью ViewModels.

Ответ 4

Я использую MVVM с MEF уже несколько лет, и я не уверен, насколько он полезен. В нашем развитии мы не используем ViewModels для разных представлений, и у нас нет дизайнеров, которым разрешено изменять представление (UI).

В ViewModel многое сделать сложно, например, установка фокуса курсора в зависимости от изменений в ViewModel (да, это возможно, но добавляет много помех в код).

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