MVVM дублирование свойств модели в ViewModel

Кажется, что есть руководство, что модель не должна предоставлять свои сущности для просмотра, и что все необходимые свойства должны быть дублированы в ViewModel

пример:

Product
Id {get; set;}
Name {get; set;}
.......


ProductViewModel : ViewModelBase
Id {get; set;}
Name {get; set;}
.......

зачем это нужно? Я могу понять это, если модель не реализует INPC, но если это так, то я нахожу это совершенно ненужным.

4 ответов


когда представление привязано к модели:

  • Если представление необходимо изменить или у вас есть несколько представлений, изменение модели вызовет изменения всех представлений, связанных с этой моделью.

  • с точки зрения представления объект, к которому он привязан, может быть не таким интуитивным; когда вам нужно добавить свойства и / или команды к объекту, вы добавляете их в ViewModel и сохраняете "исходные" свойства в модели или изменяете модель?

наличие ViewModel дает вам дополнительную абстракцию между одной моделью и несколькими (версиями) представлениями

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


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

Я склонен только к свойствам прокси-модели, если мне нужно (либо INPC, либо какая-то конкретная логика, например, модель имеет имя и фамилию, но не полное имя)

в противном случае я привязываюсь к модели (которая является общедоступным свойством в ViewModel). Если моя ситуация изменится и мне нужно инкапсулируют что-то я рефакторинг, когда у меня есть потребность.

Я всегда стараюсь гарантировать, что ViewModel на месте (даже если он только предоставляет модель), поэтому рефакторинг легче позже.


мой вопрос в том, почему ваши модели реализуют INPC? Им это нужно?

обычно модели-это просто DTO и не нуждаются в логике изменений.

также, если ваша базовая реализация INPC исходит из платформы MVVM, но ваши модели существуют в общей сборке, нужна ли эта сборка тогда ссылка на вашу платформу MVVM и потенциально другие сборки WPF?

сценарий у нас был набор общих объектов, представляющих наши данные на как сервер, так и клиентская сторона. Клиентская сторона была приложением WPF, так что это было хорошо, но для серверной стороны была служба, поэтому нам не нужен INPC.


ваша ViewModel неверна. Если у вас уже есть модель типа продукта, вы можете просто определить что-то подобное в своей ViewModel: общественного продукта {...}