Сложная структура данных на уровне ViewModel MVVM

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

В основном у меня сложная структура связанных списков в моей бизнес-логике. Теперь я хочу создать ViewModel для этого, чтобы подготовить его для View, и здесь я уперся в стену. Я просто не могу понять, как приготовить этот беспорядок и при этом сохранить все эффективно и организованно.

Первая проблема заключается в том, что упаковка каждой коллекции в collectionViewModel путем перечисления элемента за элементом и создания itemViewModel создаст дублирующую модель itemViewModel для каждого элемента (поскольку один элемент может содержаться в нескольких коллекциях)

Вторая проблема - как держать все в курсе? Если, например, элемент 1 в бизнес-логике меняет свою ссылку с элемента 2 на элемент 3, модели ViewModels должны соответствующим образом обновить их.

У меня действительно возникает соблазн оторваться от шаблона MVVM здесь, хотя я не хочу этого, и поместить бизнес + логику представления в один объект / класс, поскольку эта структура спагетти кажется слишком большой для моего уровня понимания MVVM.

Спасибо


person matori82    schedule 21.06.2010    source источник


Ответы (1)


Может, я здесь не на то дерево лаю, но вот оно.

У вас может быть модель, которая действует как репозиторий для всех ваших файловых объектов, а также предоставляет события ItemAdded и ItemRemoved, а также метод Query. Затем у вас может быть общий тип ViewModel, который представляет ваше представление об этой модели (ViewModel), но специализируется на составлении запроса. Таким образом, у вас может быть экземпляр ViewModel + Query (например, все файлы с расширением txt) для каждого представления, которое вам нужно представить. ViewModel будет отвечать за выполнение запроса к вашей модели (путем вызова метода запроса), а затем преобразование результатов в наблюдаемую коллекцию файловых элементов (или что-то еще). Вы можете обновить свою ViewModel в ответ на изменения модели, подписавшись на события ItemAdded и ItemRemoved. Если в событии ItemRemoved ваша коллекция элементов файла ViewModel содержит элемент, удалите его. Если в событии ItemAdded элемент соответствует условию запроса для этого экземпляра ViewModel, добавьте его в коллекцию.

Это позволяет вам иметь одну модель для всех ваших файлов, а затем экземпляр ViewModel (+ Query) для каждого типа представления, которое вы хотите представить. События ItemAdded и ItemRemoved позволяют обновить ViewModel. Поскольку элементы в ViewModels являются наблюдаемыми коллекциями, ваши представления базы данных будут обновляться сами.

person Tim Lloyd    schedule 21.06.2010