Действительно ли 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.