Разница между моделью и моделью представления - PullRequest
9 голосов
/ 29 сентября 2010

Я никогда не использовал MVVM раньше, поэтому я, вероятно, упускаю что-то очевидное. Когда я создаю новое приложение Panorama, уже есть папка ViewModel, содержащая ItemViewModel и MainViewModel.

Я думал, что "MainViewModel.cs" - это файл, который организует панораму. Однако в MainViewModel он имеет следующую строку:

public MainViewModel()
{
    this.Items = new ObservableCollection<ItemViewModel>();
}

ItemViewModel не взаимодействует с панорамой. Вот такие экземпляры:

this.Items.Add(new ItemViewModel() 
{ 
    LineOne = "first line", 
    LineTwo = "second line", 
    LineThree = "third line" 
});

Почему ItemViewModel не просто «Модель»? Он реализует INotifyPropertyChanged, но для какой цели? Я бы подумал, что ObservableCollection в MainViewModel будет достаточно, чтобы уведомить о любых изменениях, как показано здесь

Ответы [ 3 ]

13 голосов
/ 29 сентября 2010

Разница довольно проста.

Модель содержит бизнес-логику.
Модель представления содержит логику представления и имеет дополнительную форму для соответствия представлениям.

В вашем случае - модель представления реализует INotifyPropertyChanged.Это чистая логика представления.

Модель не отвечает за уведомление одного конкретного пользовательского интерфейса о том, что что-то изменилось, она отвечает за передачу счетов, расчет заработной платы и т. Д.

Иногда (когда модель проста) эта абстракцияхотя в этом нет необходимости.


Некоторые вики цитаты:

Модель : как и в классическом паттерне MVC, модель относится либо к
(a) объектная модель, которая представляет контент реального состояния (объектно-ориентированный подход), или
(b) уровень доступа к данным, который представляет этот контент (подход, ориентированный на данные).

ViewModel : ViewModel - это «модель представления», то есть абстракция представления , которая также служит для привязки данных между представлением и моделью.Это можно рассматривать как специализированный аспект того, что будет контроллером (в шаблоне MVC), который действует как механизм связывания / преобразования данных, который изменяет информацию о модели в информацию о представлении и передает команды из представления в модель.ViewModel предоставляет общедоступные свойства, команды и абстракции.ViewModel уподоблен концептуальному состоянию данных, а не реальному состоянию данных в модели .

11 голосов
/ 29 сентября 2010

Это общая концепция всех архитектур MV [x], хотя MVC, MVP или MVVM:

  • У вас есть модель с одной стороны, которая в основном является программной абстракцией вашего бизнесадомен.Он не знает и не заботится о каких-либо вещах, связанных с пользовательским интерфейсом (например, в вашем случае «уведомление пользовательского интерфейса об изменениях»).Он реализует бизнес-логику и все.
  • С другой стороны, у вас есть пользовательский интерфейс, со специфическими потребностями как в техническом плане (например, «WPF хочет привязаться к ObservableCollection»), так и в плане пользователяпрезентация (подумайте, например, о разных порядках дат или разных десятичных знаках на разных языках).
  • Чтобы справиться с этим и иметь возможность четко разделить эти требования в чистой архитектуре, в вашемчехол ViewModel.Это единственный слой в программном обеспечении, который знает как интерфейс, так и модель.В противном случае между ними не должно быть никакой связи.

В вашем простом примере это может выглядеть излишним, но обычное программное обеспечение для бизнеса будет иметь десятки или даже сотни таких триплетов MV [x].и у вас не было бы способа поддерживать чистую архитектуру без этого.

Чтобы ответить на ваш вопрос: в вашем примере приведен лишь небольшой код для настройки описанной архитектуры.

НТН!Томас

6 голосов
/ 29 сентября 2010

ObservableCollection будет уведомлять, когда элементы добавляются или удаляются из списка, но INotifyPropertyChanged на ItemViewModel требуется, если вы хотите, чтобы уведомления происходили при изменении этих свойств.

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