2015-04-23 3 views
2

Я ищу хороший пример/способ TRUE разделение между MVVM View и ViewModel. Мне даже не нужна 1 ссылка в представлении ViewModel или наоборот.MVVM: Истинное разделение между GUI и ViewModels


Описания проблемы

Просто visuallise моей проблемы: Imagine 3 раздельных проектов; GUI (Views), Logic (ViewModels) и Model.

Обзор:

enter image description here

Как настроить решение, так что это не приведет к ссылкам круг?

подход

Одна мысль моя была использовать 4-ый проект как своего рода брокера:

enter image description here

Что мне не нравится об этом, является то, что логика (ViewModel) будет основным проектом в этом случае. Или, может быть, все в порядке, и у меня просто странные чувства.

Что вы, ребята, думаете?


Редактировать

Благодаря Чарльзу Магера я нашел очень интересную статью, в которой отображение является предопределенным и поэтому, когда он вызывает метод ShowDialog он решает на основе отображения, пользовательский интерфейс для нагрузки. CodeProject: Showing Dialogs When Using the MVVM Pattern

+0

Я добавил ваше первое изображение, но ваш второй выглядит идентичным - вы хотите его проверить? – slugster

+0

спасибо и да там что-то не так. Я заменил вторую ссылку, поэтому теперь она должна указывать на правильную картинку. –

+0

Одним из лучших и простых способов сделать это является использование контейнера инъекций зависимостей (например, Unity) и ссылки только через интерфейс. Таким образом, ваше представление будет иметь свойство «IViewModel ViewModel {get; set;}'), и оно заполнит это свойство, разрешив интерфейс из контейнера DI. – slugster

ответ

1

Если у вас нет ни одной ссылки между View и ViewModel, то почему ваш проект ViewModels пытается ссылаться на проект Views?

Ваше изображение подразумевает, что это позволяет показывать диалоги. То, что вы обычно делали в этой ситуации, - это определить интерфейс в проекте ViewModels, который имеет метод ShowDialog(object viewModel) - назовите его IDialogService или что-то в этом роде.

Вы бы тогда 4-й загрузчика проекта, который будет заботиться о запуске приложения, показывая главное окно и будет реализовывать эту IDialogService, отображающей ViewModel к представлению и показывая его.

+0

точно, чтобы показать Диалоги и другие виды. звучит точно так же, как и то, что я ищу, и с помощью ключевого слова IDialogService. Я нашел несколько примеров проектов. Спасибо! PS: Sry, я не могу выдвинуть ваш ответ и не выполнять другие действия, чтобы показать, что это было полезно. Опять же из-за отсутствия точек репутации ... –

1

VM, зная о представлении, гораздо более сомнительно, и вам, вероятно, следует избегать его. Возможно, вы захотите реализовать функциональность диалога в проекте View. Просто потому, что это логика не означает, что виртуальная машина должна отвечать за нее. Если у вас есть viewmodel, который настоятельно выполняет такие методы, как ShowDialog(), вам следует, вероятно, реорганизовать виртуальную машину и вытащить вызов метода ShowDialog() в библиотеку View. Если вы должны запустить его с помощью виртуальной машины, определите делегаты метода в ViewModel для запуска, но назначьте ShowDialog() этому делегату на уровне представления.

+0

в версии, которую я реализовал сейчас, есть эта служба, которая знает, какая модель просмотра принадлежит какому виду. Поэтому, когда другой (основной) проект запускает приложение и создает виртуальную машину, он передает интерфейс службы в конструкторе. Теперь VM может вызвать функцию диалога show, не зная ничего о представлении. Служба решает в зависимости от пройденной модели просмотра, которую она должна отображать. –

+0

@ HansVader похоже, что вы уже приняли решение по шаблону, но для записи я хотел бы сказать, что у вас могут быть проблемы с организацией и обслуживанием кода. Вызов метода ViewModel с именем 'ShowDialog()' является неявным связыванием вашего графического интерфейса с вашим ViewModel, потому что ваш ViewModel понимает концепцию диалога, который действительно должен быть ограничен представлением. Я думаю, было бы лучше иметь событие на вашем ViewModel, которое запускает ViewModel, но View назначает вызов метода ShowDialog() для события. Вот скрипка: https://dotnetfiddle.net/dCMumi – moarboilerplate

+0

Да, я уже столкнулся с такой проблемой, когда создал маску входа. Поскольку я хочу переключиться на пользовательский интерфейс реестра, но виртуальная машина не должна знать, является ли это просто UserControl или диалоговым окном ... Я, вероятно, воспользуюсь чем-то вроде вашего предложения с событиями. Спасибо! –

Смежные вопросы