В моем приложении WPF я хочу создать новый вид. Где я должен это сделать - во ViewModel или Model ?
Приложение представляет собой (очень простой на данный момент) инструмент в форме окна с одной кнопкой «Отправить». В случае, если выбран один из флажков, должно появиться новое окно с использованием той же модели представления, чтобы запросить у пользователя дополнительные сведения. Для целей этого вопроса давайте рассмотрим только новый подход окна, не рассматривая другие подходы, такие как показанная / скрытая панель.
В идеале в View не должно быть никакого кода. Кроме того, поскольку View не имеет никакой логики, VM изначально должна проверить, нужно ли создавать новое представление, и - когда это необходимо - вернуть эту ответственность обратно на View, что приведет к раздуванию кода.
С другой стороны, создание нового представления в ViewModel нарушает принцип, согласно которому ViewModel не должен ничего знать о View.
Итак, лучше ли создавать новые представления в View или ViewModel?
Ответы:
Я использую внедрение зависимостей и внедрение
IViewFactory
в модель представления для соблюдения обоих ограничений.А
ProductViewModel
(например) звонкиthis.viewFactory.Show("Details", this)
открыватьProductDetailsView
с собой какProductViewModel
. Также можно открыть представление на основе другой модели представления с помощьюthis.viewFactory.Show<ClientViewModel>()
.Реализация (на самом деле их несколько для WinForms, простая Wpf Windows, оболочка Wpf с вкладками, ...) основана на
StructureMap
соглашении. Представления обозначают свою модель представления черезIView<ProductViewModel>
интерфейс.Таким образом, модель представления ничего не знает о представлении, кроме его роли (представление по умолчанию, представление сведений, ...), и представление не содержит кода для создания другого представления. Кроме того, модели представлений находятся в отдельной сборке, которая не ссылается ни на одну сборку Wpf.
источник
Теоретический ответ
Если у вас есть
ViewModel
действия, действия, которые имеют косметические эффекты (например, выделение элемента при наведении курсора мыши), являются заданиямиView
, в то время как действия, которые имеют "реальные" эффекты (например, порождают новое окно), являются заданиемViewModel
.Таким образом, создание нового окна - это работа для
ViewModel
. Однако ни View, ни the неViewModel
должны знать, как именно создать Window, это не входит в их обязанности и относится к другому классу.Можно утверждать, что создание нового окна - это работа для
View
. Хотя я бы не согласился, в такой дискуссии нет особой ценности, потому что на практике это не конец света, если вы поместите этот код вView
, и также не так много работы, чтобы переместить егоViewModel
в более поздний момент. , Важной частью является то, что логика для создания нового окна содержится в независимом классе, обычно это своего рода WindowFactory. Смысл MVVM, MVP, MVC и т. Д. В том, что у вас есть классы с небольшим количеством четко определенных обязанностей. Вот почему вы не добавляете дополнительные обязанности кView
,ViewModel
илиModel
если вам не нужно.Ни при каких обстоятельствах создание окна не принадлежит
Model
, потому чтоModel
он даже не знает, что есть что-то вроде графического интерфейса.Практический ответ
Речь идет о «инструменте в форме окна с одной кнопкой« Отправить » . Итак, вот бесстыдная заглушка для моего соответствующего ответа: зачем использовать MVVM?
Подводя итог, что говорит этот ответ: Сделайте это простым. Да, и имейте в виду приведенный выше теоретический ответ для реализации, когда окно с одной кнопкой станет более сложным.
источник