Пытаясь понять архитектуру MVVM - PullRequest
7 голосов
/ 16 ноября 2011

Я пытаюсь изучить MVVM и WPF и использую легкий инструментарий MVVM. Вот что я не совсем понимаю, и, возможно, это связано с неправильной архитектурой моего пользовательского интерфейса.

То, что я пытаюсь сделать, на самом деле довольно просто. Кстати, это служебное приложение. Мне нужно окно, которое служит, так сказать, «контроллером», в котором есть набор кнопок. Каждая кнопка должна изменить содержание кадра. Пример: одна кнопка загружает «экран» (или «вид», если хотите), который позволяет пользователю настроить «Агентство», которое является пользовательским объектом. Другая кнопка загружает список пользователей из агентства, которое было на первом «экране». Это представление «Пользователи» также должно быть загружено в том же кадре. Фактически, на данный момент окно со всеми кнопками действительно отвечает только за загрузку «экранов» в кадре. Мясо приложения будет находиться во всех отдельных «экранах»

Что я не понимаю, так это 1) как дать каждому экрану / представлению знать друг о друге, так как один зависит от другого. Кажется, что в MVVM ViewModel не должен знать ни о чем. Но в моем случае мне нужно передать информацию (например, мое агентство).

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

Спасибо!

Ответы [ 4 ]

13 голосов
/ 16 ноября 2011

Некоторые идеи, которые могут соединить некоторые точки:

  • Скорее всего, у вас будет одна модель просмотра для каждого вида ("экран").
  • Каждая модель представления будет содержать всю логику для соответствующего представления
  • Viewmodels может и узнает о моделях (Агентство, Пользователи)
  • Viewmodels могут общаться друг с другом через Messenger в MVVM Light
  • Думайте о MVVM Light Messenger как о «универсальной системе обработки событий». Когда вы отправляете сообщение из одной модели представления, любая другая модель представления может прослушивать это сообщение / событие и реагировать на него при необходимости.

Помогает ли это вообще? Держите ваши мысли, и я буду комментировать, и я уверен, что сообщество будет так же:)

4 голосов
/ 16 ноября 2011

Несколько вещей:

  • на каждом из ваших экранов должен быть отдельный вид (например, пользовательский контроль или новое окно - я полагаю, вы уже сделали это)
  • каждая частьмодель (например, Агентство, Пользователь), которую вы хотите отобразить в своем приложении, должна быть обернута в свою модель выделенного вида
  • ваши представления на самом деле не должны знать друг о друге;Вы можете использовать команды или события в моделях представления, чтобы избавиться от этих зависимостей.
  • модель представления должна знать только о одной вещи: модель основана на
  • думать о представлении как о действительно простом классе с единственной обязанностью рендеринга контента;никакой логики, никакого кода (если он не связан исключительно с пользовательским интерфейсом / дисплеем) - это то, что нужно соблюдать

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

Еще одна вещь: поскольку вы упомянули, что вы можете отображать несколько экранов в одной (я полагаю) основной области, подумайте о том, чтобы снабдить ваши модели представленийчто-то вроде свойства bool IsCurrentlyActive.Таким образом, вы можете легко показывать / скрывать представления с помощью нажатий кнопок и по-прежнему использовать механизм привязки.

2 голосов
/ 16 ноября 2011

Они не должны знать друг о друге.Это то, что Messenger для контроллеров и представлений подписывается на интересующие их события. Таким образом, им не нужно знать или заботиться о том, откуда они произошли.

Хмм Кендрик быстрее.Что он сказал.

Также звучит так, как будто вы хотите интерфейс типа Outlook, некоторую навигацию, которая загружает другие представления.У меня был тот же вопрос некоторое время назад. Как сделать Регионы в WPF без Призмы?

1 голос
/ 16 ноября 2011

Чтобы лучше понять шаблон MVVM, взгляните на эту статью: Приложения WPF с шаблоном проектирования Model-View-ViewModel

Также я советую вам взглянуть на Caliburn Micro рамки.

...