MVVM-разница между моделью и ViewModel

Я никогда не использовал 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 ответов


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


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

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

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

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

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


некоторые wiki цитаты:

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

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


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

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

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

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

HTH! Томас!--2-->