Основные понятия MVVM – что должен делать ViewModel?

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

Из того, что я понимаю, вид немой, он просто знает, как представить что-то, что ему передается.

Модели – это просто простые данные, а ViewModel – это нечто вроде действия между ними, что он должен получать информацию от Модели и передавать ее на представление , а View должен знать, как ее представить. Или наоборот, если информация в представлении изменяется, она должна перейти к изменению модели .

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

Благодаря 🙂

Мне нравится думать так:

Взгляды, как вы говорите, глупы. Джош Смит, автор оригинальной и часто связанной статьи MSDN на MVVM, сказал, что представления – это «одежда, которая носит данные». Представления никогда не содержат данные или напрямую манипулируют им, они просто привязаны к свойствам и командам ваших моделей viewmodels.

Модели – это объекты, которые моделируют область вашего приложения , как в бизнес-объектах. Является ли ваше приложение музыкальным магазином? Возможно, вашими объектами модели будут художники, альбомы и песни. Является ли ваше приложение браузером для организации диаграмм? Возможно, вашими объектами модели станут менеджеры и сотрудники. Эти объекты модели не связаны с каким-либо визуальным рендерингом, и они даже не имеют прямого отношения к приложению, в которое вы их вставляете, – ваши объекты модели должны иметь смысл полностью самостоятельно, как семейство объектов, которые представляют собой своего рода домена. Уровень модели также обычно включает такие вещи, как аксессоры доступа.

Это приводит нас к Viewmodels. Кто они такие? Это объекты, которые моделируют приложение GUI , а это означает, что они предоставляют данные и функции, которые будут использоваться представлениями. Это то, что определяет структуру и поведение фактического приложения, которое вы строите. Для объектов модели домен – это любой домен, который вы выберете (музыкальный магазин, браузер организационной диаграммы и т. Д.), Но для модели просмотра этот домен является графическим приложением. Ваши модели представлений будут инкапсулировать поведение и данные всего, что делает ваше приложение. Они собираются выставлять объекты и списки как свойства, а также такие вещи, как Commands. Команда – это просто поведение (в самом простом, вызов метода), завернутое в объект, который его переносит – эта идея важна, потому что представления управляются привязкой данных, которая прикрепляет визуальные элементы управления к объектам. В MVVM вы не даете кнопке метод Click handler, вы привязываете его к объекту команды (обслуживаемому из свойства в режиме просмотра), который содержит функции, которые вы хотите запустить при нажатии на нее.

Для меня самыми запутанными битами были следующие:

  • Несмотря на то, что модели представлений являются моделями графического приложения, они напрямую не ссылаются или не используют визуальные концепции. Например, вам не нужны ссылки на элементы управления Windows в ваших моделях ViewModels – все это происходит в представлении. ViewModels просто выставляют данные и поведение элементам управления или другим объектам, которые будут привязываться к ним. Например – у вас есть представление со списком в нем? В вашей модели просмотра почти наверняка будет какая-то коллекция. У вашего вида есть кнопки? В вашей модели просмотра почти наверняка будут какие-то команды.
  • Есть несколько видов объектов, которые можно было бы рассматривать как «viewmodels». Простейший вид viewmodel для понимания – это тот, который непосредственно представляет собой элемент управления или экран в соотношении 1: 1, так как в «экране XYZ есть текстовое поле, список и три кнопки, поэтому для модели просмотра требуется строка, и три команды ». Другой вид объекта, который вписывается в слой viewmodel, представляет собой оболочку вокруг объекта модели, которая дает ему поведение и делает его более удобным для использования по представлению – здесь вы попадаете в понятия «толстые» и «тонкие» слои viewmodel. «Тонкий» слой viewmodel представляет собой набор режимов просмотра, которые отображают ваши объекты модели непосредственно в представлениях, что означает, что представления в конечном итоге привязываются непосредственно к свойствам объектов модели. Это может работать для таких вещей, как простые представления только для чтения, но что, если вы хотите иметь поведение, связанное с каждым объектом? Вы не хотите, чтобы в модели, потому что модель не связана с приложением, она относится только к вашему домену. Вы можете поместить его в объект, который обертывает ваш объект модели и предлагает более дружественные к делу данные и поведение. Этот объект-shell также рассматривается как viewmodel, и с их результатом получается «более толстый» слой viewmodel, где ваши представления никогда не будут напрямую привязываться к чему-либо в classе модели. Коллекции будут содержать модели просмотра, которые обертывают модели, а не просто содержат сами модели.

Кроличья дыра идет глубже – есть много идиом, чтобы понять, как ValueConverters, которые поддерживают MVVM, и есть много примеров, когда вы начнете думать о вещах, таких как Blendability, testing и как передавать данные в вашем приложении, и убедитесь, что каждая модель просмотра имеет доступ к поведению, в котором она нуждается (именно там происходит инъекция зависимостей), но, надеюсь, это хорошее начало. Ключ должен думать о ваших визуальных эффектах, вашем домене, структуре и поведении вашего фактического приложения как о трех разных вещах.

Используя эту невероятно полезную статью в качестве источника, вот резюме для View , ViewModel и Model .


Посмотреть:

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

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

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

  • Представление определяет и обрабатывает визуальное поведение пользовательского интерфейса, такое как анимация или переходы, которые могут быть вызваны из изменения состояния в модели представления или посредством взаимодействия пользователя с пользовательским интерфейсом.

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

ЗАМЕТКА:
Поскольку модель представления не должна иметь явного знания конкретных визуальных элементов в представлении, код для программного управления визуальными элементами в представлении должен находиться в кодовом представлении представления или быть инкапсулирован в поведении.


Модель:

  • Модель просмотра – это невизуальный class и не является базовым classом WPF или Silverlight. Он инкапсулирует логику представления, необходимую для поддержки прецедента или пользовательской задачи в приложении. Модель просмотра может быть проверена независимо от вида и модели.

  • Обычно модель просмотра напрямую не ссылается на представление. Он реализует свойства и команды, к которым может привязываться представление. Он уведомляет мнение о любых изменениях состояния посредством событий уведомления об изменениях через интерфейсы INotifyCollectionChanged и INotifyCollectionChanged .

  • Модель просмотра координирует взаимодействие представления с моделью. Он может преобразовывать или манипулировать данными, чтобы он мог легко потреблять вид и мог реализовывать дополнительные свойства, которые могут отсутствовать в модели. Он также может выполнять проверку данных через интерфейсы IDataErrorInfo или INotifyDataErrorInfo .

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

ЗАМЕТКА:
Все, что важно для логического поведения приложения, должно войти в модель представления. Код для извлечения или манипулирования элементами данных, которые должны отображаться в представлении посредством привязки данных, должен находиться в модели представления.


Модель:

  • Классы моделей – это не визуальные classы, которые инкапсулируют данные приложения и бизнес-логику. Они отвечают за управление данными приложения и за обеспечение его согласованности и достоверности путем инкапсуляции необходимых бизнес-правил и логики проверки данных.

  • Классы моделей напрямую не ссылаются на classы представления или представления модели и не зависят от того, как они реализованы.

  • Классы моделей обычно предоставляют события уведомления об изменениях свойств и коллекции через интерфейсы INotifyCollectionChanged и INotifyCollectionChanged . Это позволяет им легко привязывать данные в представлении. Классы моделей, представляющие коллекции объектов, обычно выводятся из classа ObservableCollection .

  • Классы моделей обычно обеспечивают проверку данных и отчетность об ошибках через интерфейсы IDataErrorInfo или INotifyDataErrorInfo .

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

Я написал это как «простой английский», как я могу представить в этой серии на MVVM . В частности, эта диаграмма , вероятно, является самым простым, коротким объяснением.

При этом, в основном, «модель» – это ваши данные или бизнес-правила. Он действительно не должен знать о том, как и где он будет использоваться, и особенно не о том, какая технология собирается его использовать. «Модель» – это основная суть приложения – и не нужно беспокоиться о том, является ли приложение WPF, Silverlight, Windows Forms, ASP.NET и т. Д. – это просто «сама» в чистой форме.

«Вид» – это та часть, которая полностью зависит от технологии. В MVVM, в идеале, представление должно быть почти 100% XAML, так как это дает некоторые огромные выгоды для гибкости.

Тем не менее, должно быть что-то, что переводит информацию из Модели в ту или иную форму, где она может быть использована технологией под рукой – здесь используется ViewModel. Например, это часто «завершает» classы модели в «ViewModel» для этих конкретных данных, которые include в себя Команды (для запуска логики), реализует INotifyPropertyChanged (для поддержки привязки данных) и т. Д. Вот и все – это мост, который делает Модель, используемая View.

Отличное введение в MVVM можно найти здесь в видео Джейсона Долинджера. Я продолжал видео со мной некоторое время, когда я начинал, это действительно полезно.

Создание ViewModel, представляющего согласованный фасад над базовой моделью, может быть намного сложнее, чем выглядит. Эта статья о создании объектов ViewModel демонстрирует, как создать ViewModel, и иллюстрирует некоторые из проблем, с которыми вы, вероятно, столкнетесь – вместе с тем, что выглядит как разумные решения. Когда я его читал, раздел о работе с коллекциями отсутствовал, но у него все еще были интересные моменты.

  • Связывание данных с SelectedItem в WPF Treeview
  • Изменение вида для ViewModel
  • Как реализовать индикатор выполнения с использованием шаблона MVVM
  • Изменяет ли атрибут привязки WPF маркер к streamу пользовательского интерфейса?
  • MVVM для winforms
  • Как вызвать функции в модели основного вида из других моделей представлений?
  • В чем разница между MVC и MVVM?
  • Связывание WPF DataGridComboBoxColumn с MVVM
  • Установите фокус на текстовое поле в WPF из модели просмотра (C #)
  • Переход к следующему элементу управления нажатием клавиши Enter в WPF
  • WPF MVVM TreeView SelectedItem
  • Interesting Posts

    Почему мой компьютер автоматически перезапустится после «выключения» и «сна»?

    Почему нет микро USB-кабелей Micro USB?

    Проверьте, присутствует ли элемент в массиве Bash

    Яблочные полосы прокрутки с использованием CSS

    Как вы находите максимальное значение в столбце, пропуская до каждого n-го значения?

    Maven скопирует локальный файл на удаленный сервер с помощью SSH

    Как настроить кеш статического содержимого для каждой папки и расширения в IIS7?

    Папка Windows.old, загруженная с помощью Vista – нужна ли она?

    Незарегистрированное исключение java.sql.SQLException; должны быть пойманы или объявлены брошенными?

    Преимущества / Недостатки разделения диска

    Как получить текущий часовой пояс пользователя в c #

    C # оптимизирует конкатенацию строковых литералов?

    Как я могу перенести окно приложения на передний план?

    Является ли setTimeout хорошим решением для создания асинхронных функций с помощью javascript?

    Загрузка файла JSF 2.0

    Давайте будем гением компьютера.