Где должны храниться свойства ViewModel / View? - PullRequest
2 голосов
/ 21 марта 2012

Простой пример: у меня есть VM с иерархической структурой элементов, и я спроектировал View, содержащий TreeView.Каждый узел дерева соответствует элементу данных, связанному с элементом в модели.GUI должен учитывать пользовательские настройки и настройки и хранить различные параметры, в том числе независимо от того, развернут ли каждый конкретный узел или нет.Поскольку каждый узел связан с некоторыми данными, нам нужно связать настройки View с моделью.Я считаю, что это не нормально, чтобы определить свойство IsExpanded в классе, стоящем для модели.

Так где же хранить настройки, чтобы они соответствовали данным?

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Я считаю, что нельзя определять свойство IsExpaned в классе, обозначающем Модель.

Почему?Будут ли случаи, когда модель связана с двумя различными древовидными представлениями?

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

В противном случае вполне допустимо поместить это правильно в модель, особенно если эта модель используется специально для обслуживания этого представления.Как и во всем, начните с самого простого, самого прагматичного подхода.

1 голос
/ 21 марта 2012

Я был в подобной ситуации, вот что я сделал, чтобы решить ее.

Каждый узел ViewModel имел свойство IsExpanded, которое было привязано к свойству TreeViewItem IsExpanded. Я не хотел сохранять состояние дерева, сохраняя его в свойствах Model в свойствах IsExpanded (это связано с визуальным состоянием, верно?). Поэтому вместо этого я заставил древовидную структуру виртуальной машины сгенерировать словарь, в котором сохранено состояние расширения для каждого узла в сравнении со строковым ключом, сгенерированным из состояния узла в дереве:

Dictionary<string, bool> treeExpandedStates

У каждого узла в дереве был свой идентификатор, поэтому в моем случае ключ был чем-то вроде "/ 1/3/7", но подойдет все, что уникально. Этот словарь был затем сериализован в файл при закрытии приложения (на самом деле это был SerializableDictionary). Затем при перезапуске приложения оно было десериализовано и использовалось для установки состояния расширения после повторной загрузки иерархии. Это означало, что состояние дерева было именно таким, каким его оставил пользователь, но в модели ничего не было сохранено.

0 голосов
/ 21 марта 2012

Я распознаю проблему как распространенную дилемму в MVVM.Я могу смотреть на это с двух сторон.

Подход A)

В разделении View, Model и ViewModel то, что вы описываете , находится в Model .Вы пишете, например, что это нужно хранить.Это не означает, что это та же часть модели, что и другие данные модели.

Рассмотрим следующее разделение:

  • FolderModel - модель содержимого или свойств папки.
  • TreeNodeModel - модель выбора пользователей при изучении древовидного представления.

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

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

Почему данные для модели данных не должны быть в состоянии взаимодействовать с пользователем?:)

Подход B)

Мой обычный подход к этим дилеммам , однако, заключается в том, что свойства, подобные IsExpanded, по большей части не нужно хранить между сессиями.Таким образом, свойства в ViewModel, со значением по умолчанию вместо сохраненного значения, достаточно.:)

И если его нужно сохранить, его не нужно хранить в модели.ViewModel для логики для представления данных модели.Если ViewModel хочет сохранить свое логическое состояние, то не нужно хранить в модели .

Сводка

На мой взгляд, вы можете сохранить еголюбой из этих способов без нарушения шаблона MVVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...