Мені подобається думати про це так:
Погляди, як ти кажеш, німі. Джош Сміт, письменник основної статті, на яку часто посилається стаття MSDN про MVVM, заявив, що погляди - це "одяг, який носять дані". Представлення фактично ніколи не містять даних або безпосередньо ними не маніпулюють, вони просто пов'язані з властивостями та командами ваших моделей перегляду.
Моделі - це об’єкти, що моделюють домен вашої програми , як у бізнес-об’єктах. Ваша програма є музичним магазином? Можливо, вашими модельними об'єктами будуть виконавці, альбоми та пісні. Ваша програма є орг-діаграмою? Можливо, об'єктами вашої моделі будуть менеджери та співробітники. Ці об’єкти моделі не пов’язані з будь-яким візуальним візуалізацією і навіть не пов’язані безпосередньо з додатком, в який ви їх розміщуєте - об’єкти моделі повинні мати сенс повністю самостійно як сімейство об’єктів, що представляють певний домену. Рівень моделі також зазвичай включає такі речі, як доступ до послуг.
Це призводить до Viewmodels. Хто вони? Вони є об'єктами, що моделюють програму графічного інтерфейсу, тобто вони надають дані та функціональні можливості, які будуть використовуватися поданнями. Саме вони визначають структуру та поведінку фактичного додатка, який ви створюєте. Для об'єктів моделі домен - це будь-який вибраний вами домен (музичний магазин, браузер організаційних діаграм тощо), але для моделі перегляду домен є графічним додатком. Моделі перегляду збираються інкапсулювати поведінку та дані всього, що робить ваша програма. Вони збираються виставити об'єкти та списки як властивості, а також такі речі, як команди. Команда - це просто поведінка (найпростіший - виклик методу), обгорнута в об’єкт, який її переносить - ця ідея важлива, оскільки подання керуються прив’язкою даних, яка прикріплює візуальні елементи керування до об’єктів. У MVVM ви не надаєте кнопці метод обробника кліків,
Для мене найбільш заплутаними бітами були такі:
- Незважаючи на те, що моделі перегляду є моделями графічного додатка, вони безпосередньо не посилаються і не використовують візуальні концепції. Наприклад, ви не хочете посилання на елементи керування Windows у ваших ViewModels - ці речі йдуть у поданні. ViewModels просто піддають дані та поведінку елементам керування або іншим об’єктам, які зв’язуються з ними. Наприклад - у вас є подання з ListBox? У вашій viewmodel майже напевно буде якась колекція. У вашому поданні є кнопки? У вашій viewmodel майже напевно будуть деякі команди.
- Існує кілька видів об’єктів, які можна вважати „моделями перегляду”. Найпростіший тип viewmodel для розуміння - це той, який безпосередньо представляє елемент керування або екран у співвідношенні 1: 1, як у "screen XYZ має текстове поле, список і три кнопки, тому viewmodel потребує рядок, колекцію, і три команди ". Інший тип об’єкта, який поміщається в шар viewmodel, - це обгортка навколо об’єкта моделі, яка надає йому поведінку та робить його більш корисним для подання - тут ви потрапляєте в поняття «товстий» та «тонкий» шари viewmodel. "Тонкий" шар viewmodel - це набір моделей перегляду, які виставляють об'єкти вашої моделі безпосередньо на представлення, тобто перегляди в кінцевому підсумку прив'язуються безпосередньо до властивостей об'єктів моделі. Це може працювати для таких речей, як прості подання лише для читання, але що, якщо ви хочете мати поведінку, пов’язану з кожним об’єктом? Ви не хочете цього в моделі, оскільки модель не пов’язана з додатком, вона пов’язана лише з вашим доменом. Ви можете помістити його в об'єкт, який обертає об'єкт вашої моделі та пропонує більш зручні дані та поведінку. Цей об'єкт-обгортка також вважається моделью перегляду, і їх отримання призводить до "товстішого" шару моделі перегляду, де ваші погляди ніколи не закінчуються безпосереднім прив'язуванням до чогось у класі моделі. Колекції будуть містити моделі перегляду, які обертають моделі, а не просто містять самі моделі. Ви можете помістити його в об'єкт, який обертає об'єкт вашої моделі та пропонує більш зручні дані та поведінку. Цей об'єкт-обгортка також вважається моделью перегляду, і їх отримання призводить до "товстішого" шару моделі перегляду, де ваші погляди ніколи не закінчуються безпосереднім прив'язуванням до чогось у класі моделі. Колекції будуть містити моделі перегляду, які обертають моделі, а не просто містять самі моделі. Ви можете помістити його в об'єкт, який обертає об'єкт вашої моделі та пропонує більш зручні дані та поведінку. Цей об'єкт-обгортка також вважається моделью перегляду, і їх отримання призводить до "товстішого" шару моделі перегляду, де ваші погляди ніколи не закінчуються безпосереднім прив'язуванням до чогось у класі моделі. Колекції будуть містити моделі перегляду, які обертають моделі, а не просто містять самі моделі.
Кроляча діра заглиблюється - існує безліч ідіом, щоб зрозуміти, як ValueConverters, які підтримують роботу MVVM, і є багато чого застосувати, коли ви починаєте думати про такі речі, як сумісність, тестування та про те, як передавати дані у своєму додатку та гарантувати, що кожна модель перегляду має доступ до поведінки, яка їй потрібна (саме тут входить ін’єкція залежностей), але, сподіваємось, вищесказане є хорошим початком. Головне - думати про свої візуальні ефекти, домен, структуру та поведінку вашого фактичного додатку як про три різні речі.