2015-08-24 3 views
1

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

Моя модель представляет собой набор пользовательских элементов (например, список пользовательских конфигураций).

Я понимаю, что правильный способ разоблачения этой модели - через ConfigurationListViewModel, который преобразует список модели в данные, считываемые с помощью ui.

Но как мне управлять предметами, которые находятся за ConfigurationListViewModel?
Должна ли одна конфигурация иметь ConfigurationViewModel?
Или главный ConfigurationListViewModel должен обрабатывать экспозицию своих предметов?

Если я хочу, чтобы добавить конфигурацию к моему ConfigurationList, я называю Add() метод моей ConfigurationListViewModel, и это создает в себе новый Configuration, или я должен создать новый (Configuration? ConfigurationViewModel?) В родительской, и затем вызвать Add ([Configuration? ConfigurationViewModel?] newConf)?

+0

См. Http://blog.alner.net/archive/2010/02/09/mvvm-to-wrap-or-not-to-wrap.aspx –

+0

MVVM не строго определяет детали реализации вашего сценария и у вас здесь довольно много свободы. Выберите то, что лучше всего подходит для вас здесь - обычно самое простое решение, но имейте в виду DRY и SOLID принципы. – Liero

ответ

2

Действительно, ответ любой из вышеперечисленных.

Если данные, используемые в модели представления имеет вид идентичные al к модели, вы не делаете никаких выгод, создавая класс ConfigurationViewModel, который является только копией класса Configuration.

Что касается добавлений, вы можете сделать это в любом случае. Иногда вы хотите сделать все свое редактирование в модели просмотра, чтобы вы могли «вернуть» изменения, фактически не изменяя модель. Если это не вызывает беспокойства, то модификация модели в первую очередь и распространение на модель представления так же справедлива для подхода.

Все, что сказано, ни один из ваших подходов не будет нарушать MVVM. Выберите то, что имеет наибольший смысл, особенно семантически и для будущего обслуживания. В общем, я предпочитаю простоту слепому соблюдению принципа, такого как «для каждого объекта данных требуется представление модели представления».

+0

Итак, у меня 'ConfigurationListViewModel' будет только свой внутренний' List 'и будет управлять экспонированием его элементов для представления? – user1722791

+0

@ user1722791 Вот как бы это сделать :). Предостережение. Если вам нужны разные данные в виртуальной машине, чем модель, вы не должны идти по этому маршруту. – BradleyDotNET

+0

Thanks; просто знать, если бы внутренняя «Конфигурация» нуждалась бы в ее виртуальной машине, «ConfigurationListVM» должен был иметь список «Конфигурация» или «КонфигурацияVM»? – user1722791

0

По моему опыту ConfigurationListViewModel, содержащий ObservableCollection<ConfigurationViewModel>, является лучшим (самым гибким и чистым) способом. Просто для отображения выбранных элементов по-разному, чем не выбранные элементы, полезно, когда предметы знают об их выбранном состоянии. И поскольку отбор - это ничто, о котором должна заботиться модель, вам нужен ConfigurationViewModel с собственностью IsSelected.

Обновления (добавить, удалить элементы) в списке (если они инициированы пользователем/пользовательским интерфейсом) должны выполняться в основном моделью. (Например, задача моделировать, как, например, инициализируется новый элемент.) Затем ListViewModel должен соответствующим образом изменить: создать модель представления из вновь созданного элемента модели или удалить модель представления, элемент которой был удален в модели.

+0

Imho, вместо свойства 'ConfigurationViewModel.IsSelected' вы можете использовать' ConfigurationListViewModel.SelectedItem'. Я заранее не создавал «ConfigurationViewMode'l», просто для случая, когда в какой-то момент в будущем «Конфигурация» сущность не будет легко представлена ​​с помощью xaml. Много раз вы можете просто выставить элементы из модели и избавиться от создания viewmodel для каждого элемента, mappig от модели до viewmodel и наоборот. – Liero

+0

Если вы хотите отображать выбранные элементы по-разному от не выбранных элементов (например, например, для другого шрифта шрифта), свойство 'IsSelected' дает вам доступ к выбранному состоянию непосредственно в шаблоне элемента. Для доступа к списку «SelectedItems» списка и определения выбранного состояния текущего элемента внутри ItemTemplate сложнее. Моя точка зрения: в WPF представление элемента создается на основе элемента и поэтому должно зависеть от свойств элемента, а не от свойств списка. – whyloop

+0

Свойство ListBoxItem.IsSelected, достаточное для логики представления. Вы можете получить к нему доступ из DataTemplate, используя привязку с родственниками, но в идеале вы должны реализовать состояние выбора только в стиле ListBoxItem и в ControlTemplate. В этом случае плюсы наличия ConfigurationViewModel меньше, чем те, которые я упоминал, однако в других сценариях, таких как TreeView или редактируемый Listbox (например, двойной щелчок, чтобы переименовать) я бы использовал его также – Liero