Довідка зі складним MVVM (кілька переглядів)


18

Мені потрібна допомога щодо створення моделей перегляду для наступного сценарію:

  1. Глибокі, ієрархічні дані
  2. Кілька переглядів для одного і того ж набору даних
  3. Кожен погляд - це єдиний, динамічно мінливий вигляд, заснований на активному виділенні
  4. Залежно від значення властивості, відображайте різні типи вкладок в елементі управління вкладками

введіть тут опис зображення

Мої запитання:

Чи слід створити представлення моделі перегляду для кожного перегляду (VM1, VM2 тощо)?

1. Yes:
    a. Should I model the entire hierarchical relationship? (ie, SubVM1, HouseVM1, RoomVM1)
    b. How do I keep all hierarchies in sync? (e.g, adding/removing nodes)

2. No:
    a. Do I use a huge, single view model that caters for all views?

Ось приклад одного перегляду

Малюнок 1: Кілька переглядів оновлених на основі активної кімнати. Помітьте управління вкладками

введіть тут опис зображення

Малюнок 2: Різне активне приміщення. Оновлено кілька переглядів. Елементи керування вкладками змінюються залежно від властивості об'єкта.

введіть тут опис зображення

Малюнок 3: Різний тип вибору. Цілі зміни в перегляді

введіть тут опис зображення


btw, що таке мулі? друкарський помилок?
JensG

"Мулі погляд" був помилковим. Я мав на увазі різні погляди на одну і ту ж модель / модель перегляду. Моє запитання полягало в тому, чи слід переробляти / обгортати всю ієрархію моделі для кожного перегляду, щоб кожна модель перегляду містила лише те, що потрібно окремому виду? Або я повинен створити єдину ієрархію моделі перегляду, яка містить властивості з усіх представлень? Оскільки я опублікував це питання, мені (не) пощастило з’ясувати плюси / мінуси двох, важкий шлях. Буду оновити цю тему в майбутньому з повним діагнозом мого досвіду, як тільки справи не будуть настільки суєтними.
jayars

Пам'ятайте, що правило дизайну - це показати спочатку загальні речі, а потім заглибитись у деталі. він залишить вам легкий вигляд, і якщо користувач піде глибше, з’являться нові види. тому використовуйте невеликі перегляди, розділяючи їхмодель перегляду. ознайомтеся з цим користувальницьким інтерфейсом дизайну
Csharls

@jsjslim я здригнувся, коли прочитав "зберігати всі ієрархії в синхронізації". Я підозрюю, що ви пішли з переглядом, і я підозрюю, що ви пошкодували про це (але я раніше помилявся). Заради інших читачів, у яких може виникнути те саме питання, чи можете ви принаймні дати нам швидку (іш) відповідь?
Гай Шалнат

2
@ guy-schalnat Багатовидовий перегляд був вимогою. Моя проблема полягала в тому, щоб розібратися, як побудувати перегляд моделей. Проект триває, і я не можу знайти часу, щоб скласти повний аналіз. Але підсумовуючи: я мав ігнорувати структуру моделі та зосередився на поглядах. Складність, з якою я стикався, була нав’язана сама: я хотіла так погано використовувати прив'язку даних WPF, що мене виправили. Що я зробив, врешті-решт, було добре, старе "копіювати / вставляти / рефактор". Остаточна конструкція, що вийшла, була легкою (мало повторень) і, що ще важливіше, працювала. В майбутньому випишемо повний аналіз.
jayars

Відповіді:


13

Щоб відповісти на питання, так, у кожного представлення повинна бути своя модель перегляду. Але не потрібно моделювати всю ієрархію. Тільки те, що потрібно перегляду.

Проблема, з якою у мене виникло більшість інтернет-ресурсів щодо MVVM:

У більшості прикладів Вид - це майже 1-на-1 відображення моделі. Але в моєму сценарії, де існують різні погляди на різні аспекти однієї моделі, я опиняюся між двома варіантами:

Одна монолітна модель виду, яка використовується всіма іншими моделями перегляду

введіть тут опис зображення

Або одна модель перегляду для кожного перегляду

введіть тут опис зображення

Але обидва не є ідеальними.

Модель, орієнтована на модель (MVM), хоч і мала дублювання коду, є кошмаром для підтримки

Модель перегляду, орієнтована на перегляд (VVM), створює вузькоспеціалізовані класи для кожного перегляду, але містить дублікати.

Зрештою, я вирішив, що мати один VM на перегляд простіше в обслуговуванні та кодуванні, тому я пішов із підходом VVM.

Як тільки код працює, я почав рефакторинг усіх загальних властивостей і операцій у його поточну, остаточну форму:

введіть тут опис зображення

У цій заключній формі клас моделей загального виду складається в кожен VVM.

Звичайно, мені все ж належить вирішити, що вважається загальним / спеціалізованим. І коли вигляд додається / об'єднується / видаляється, цей баланс змінюється.

Але приємна річ у тому, що я зараз в змозі підштовхувати / зменшувати членів від загального до VVM і навпаки легко.

І коротка примітка щодо синхронізації об'єктів:

Маючи загальну модель перегляду, це забезпечує більшу частину цього. Кожен VVM може просто мати посилання на ту саму загальну модель перегляду.

Я також схильний починати з простих методів зворотного виклику і еволюціонувати до події / спостерігача, якщо виникає потреба у кількох слухачів.

А для дійсно складних подій (тобто несподіваних каскадних оновлень) я перейшов би на використання Посередника.

Я не цураюся коду, коли дитина має зворотну посилання на свого батька. Все, щоб привести код в дію.

І якщо з’явиться можливість рефактора, я б скористався цим.

Уроки, які я засвоїв:

  1. Некрасивий / робочий код> Красивий / неробочий код
  2. Легше об’єднати кілька малих класів, ніж розбити величезний клас

Я хотів би, щоб я міг підкреслити це двічі. Це одне з найбільш чітких пояснень варіантів, які я бачив.
CleverPatrick

3

Дивлячись на ваші макети, я б точно рекомендував створити ієрархію ViewModels та безліч маленьких представлень. І вам, швидше за все, доведеться моделювати зовсім трохи оригінальної ієрархії.

Щоб синхронізувати речі між ViewModels, використовуйте будь-які події або переглядайте властивості один одного між ViewModels. Синхронізація між переглядами та ViewModels повинна бути стандартними властивостями сповіщення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.