Различные ViewModels для одной и той же модели отображаются в разных видах - PullRequest
1 голос
/ 09 июля 2010

В нашем проекте появился следующий сценарий: У нас есть иерархические бизнес-объекты. Корневой узел предназначен для проекта. Проект содержит различные виды данных. Эти данные разделены на «Статические данные», «Данные результатов» и «Управляющие данные».

Project
   |
   +--- Static Data
   |          |
   |          +---- Dataset 1
   |          |
   |          +---- Dataset 2
   |
   +--- Control Data
   |          |
   |          +---- Dataset 3
   |          |
   |          +---- Dataset 4
   |
   +--- Result Data
              |
              +---- Resultset

Приложение имеет вид Project Explorer (например, Solution Explorer в VS), который показывает структуру данных, как показано выше в виде дерева. Чтобы добиться этого, я создаю различные модели представления с соответствующими моделями, например, ProjectViewModel, StaticDataViewModel и DatasetViewModel для листьев. Если пользователь нажимает на один из наборов данных, открывается представление, в котором отображаются данные.

Когда я отображаю наборы данных в другом представлении, должен ли я использовать DatasetViewModel, который используется в дереве, или мне следует создать новую модель представления (DatasetDetailsViewModel)?

Две вещи, которые я читал о шаблоне MVVM: 1. ViewModel не должен знать, как его данные отображаются в представлении. 2. ViewModel - это некий конечный автомат.

Имея в виду эти две точки, я не уверен, смогу ли я использовать одну и ту же ViewModel для просмотра дерева и просмотра деталей. Как с одной стороны, я мог бы использовать ту же модель представления, потому что это просто другой вид отображения набора данных. В древовидном представлении просто отображается имя набора данных, тогда как в подробном представлении отображаются фактические данные, которые в нем содержатся. С другой стороны, модель представления представляет собой некий конечный автомат, и представления могут иметь состояния, которые не соответствуют друг другу. Например, если у меня есть флаг видимости, я мог бы установить его значение true для дерева, но в подробном виде я хочу установить значение false.

Поэтому я не уверен, стоит ли мне создавать новую модель представления или использовать существующую из древовидного представления.

Мнения разыскиваются!

Спасибо, Florian

1 Ответ

1 голос
/ 15 июля 2010

Я бы, вероятно, использовал иерархическую таблицу данных в wpf, см. эту статью.

И в принципе мне кажется, что вам просто нужен элемент управления TreeView с его ItemSource или DataContext для ProjectViewModel, а затем создать некоторые другие шаблоны данных для других ваших моделей представления.

Видите, что вашей ViewModel просто необходимо предоставить всю информацию для отображения, ей не нужно и не должно заботиться, как именно она отображается, или какая технология ее отображает (например, WPF). Вот где MVVM должен сиять, он отделяет логику пользовательского интерфейса от фактической реализации пользовательского интерфейса.

Шаблоны данных отлично подходят, потому что вы можете повторно использовать разделы xaml. Если у вас есть DataSetViewModel, вы можете создать DataTemplate, который будет отображать этот тип определенным образом без дальнейшей настройки на вашей стороне.

Каждый раз, когда вы хотите создать новую модель представления, вам нужно спросить себя: «Есть ли модель представления, у которой уже есть все эти свойства? *

Иерархические шаблоны хороши для пользовательских элементов управления, которые имеют вложенные модели представления

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