Почему MVVM и каковы его основные преимущества? - PullRequest
36 голосов
/ 29 октября 2009

Почему мы работаем с MVVM поверх MVC или MVP, когда имеем дело с WPF?

Какие дополнительные преимущества мы получаем, используя это?

Edit:

Если честно, сегодня у меня было интервью, и мне задавали этот вопрос. Я ответил как INotifyPropertyChanged, ICommand, IValue Convertor .. но он не был удовлетворен. Отныне я поставил этот вопрос

Заранее спасибо

Ответы [ 6 ]

47 голосов
/ 29 октября 2009

Я покажу вам особенно полезное видео Джейсона Долингера.

Исходя из мира WinForms, реализация любого шаблона стиля MVX казалась более трудной, чем она того стоила, но после работы с WPF в течение нескольких лет я могу честно сказать, что не стал бы рассматривать что-то меньшее. Вся парадигма поддерживается "из коробки".

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

Во-вторых, хотя ваш model может содержать все данные, которые вам могут понадобиться в вашем view, вы можете абстрагировать эти данные таким образом, чтобы ваш model не поддерживал. Например, скажем, ваша модель содержит свойство date. В модели он может существовать исключительно как DateTime объект, но ваше представление может захотеть представить его совершенно по-другому. Без viewmodel вам придется либо дублировать свойство в model для поддержки представления, либо изменить свойство, которое может серьезно запутать «модель».

Вы также можете использовать viewmodel для объединения частей вашей модели, которые существуют в отдельных классах / библиотеках, чтобы упростить интерфейс для работы с view. очень маловероятно, что вы захотите работать с данными в вашем коде так же, как пользователь захочет или захочет, чтобы эти данные были ему представлены.

Кроме того, вы получаете поддержку автоматической двусторонней привязки данных между view и viewmodel.

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

Удачи.

17 голосов
/ 29 октября 2009

Это мои специфичные для MVVM

  1. Увеличивает "смешиваемость" ваших представлений (возможность использовать Expression Blend для создания представлений). Это позволяет разделить обязанности в командах, которым повезло иметь дизайнера и программиста ... каждая из них может работать независимо друг от друга.
  2. Логика просмотра "Lookless" . Представления не зависят от кода, который выполняется за ними, что позволяет повторно использовать одну и ту же логику представления в нескольких представлениях или легко перезаписывать или заменять представления. Разделяет проблемы между «поведением» и «стилем».
  3. Нет дублированного кода для обновления представлений . В коде позади вы увидите множество обращений к myLabel.Text = newValue, разбросанных повсюду. С MVVM вы можете быть уверены, что представление обновляется надлежащим образом, просто задав базовое свойство и все его побочные эффекты.
  4. Тестируемость . Поскольку ваша логика полностью независима от вашего представления (без ссылок на «myLabel.Text»), модульное тестирование стало проще. Вы можете проверить поведение ViewModel, не затрагивая его представление. Это также позволило разработать поведение представления, управляемое тестами, что практически невозможно при использовании code-behind.

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

На самом деле, MVP (с пассивным представлением, а не с контролирующим контроллером), на мой взгляд, на самом деле просто вариант MVVM.

5 голосов
/ 29 октября 2009

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

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

3 голосов
/ 29 октября 2009

Запекание в поддержку ICommand и INotifyPropertyChanged - два самых больших преимущества.Использование MVVM позволяет легко подключать команды и вставлять данные в пользовательский интерфейс WPF.Вещи просто работают.

1 голос
/ 03 января 2016

Я лично считаю MVVM не преимуществом, а обязательством тех, кто хочет использовать интересные функции WPF.

WPF очень сильно построен с привязкой данных в ядре, что позволяет отделить пользовательский интерфейс от модели. Но способ, которым технически выполняется привязка данных в WPF, несколько особенный, поскольку он привязан к таким классам, как:

  • DependencyProperty
  • INotifyPropertyChanged
  • ObservableCollection

Из-за этого вы просто не можете написать модель так, как вы хотите, используя стандартную технологию .NET. Например, WPF TreeView практически невозможно использовать без привязки данных и шаблонов. Вы просто не можете заполнить его просто, как если бы вы использовали, например, обобщенную модель в Winforms. Он должен быть связан с иерархической моделью, использующей ObservableCollection для представления дочерних узлов.

Итак, предположим, что V представляет код XAML и его аналог с выделенным кодом (поэтому он связан с WPF как технологией), и, скажем, M представляет вашу модель (так или иначе, она не связана с технологией пользовательского интерфейса WPF).

Ну, у вас никогда не будет этой работы должным образом под WPF только с этими V & M.

Вы должны добавить что-то между ними. Нечто совместимое с WPF и понимающее вашу модель. Что-то, что говорит DependencyProperty, ObservableCollection и INotifyPropertyChanged. Это то, что называется VM.

В качестве дополнительного примечания, альтернативой MVVM является создание комбинации V & M (без подключения к VM), где M совместимо с WPF, но все еще с разумной независимостью пользовательского интерфейса. Исторически ObservableCollection находился в сборке WindowsBase.dll (которая поставлялась с WPF), поэтому было действительно странно связывать общую модель с чем-то, связанным с технологией пользовательского интерфейса. С тех пор он был перемещен обратно в System.dll. Даже тогда иногда трудно поддерживать чистую модель виртуальной машины без настройки M специально для WPF ...

0 голосов
/ 15 января 2010

Способность кода XAML связывать данные, а также наличие триггеров нарушают паттерны MVP и MVC.

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