Почему ObservableCollection и INotifyPropertyChanged в модели? - PullRequest
4 голосов
/ 11 августа 2011

Я прочитал на msdn , что для моделей в MVVM характерно реализовывать такие интерфейсы, как ObservableCollection<T>, INotifyPropertyChanged и IDataError.

Мой вопрос заключается в том, почему это делается на уровне модели, а не на уровне ViewModel. Я ожидаю, что «чистая» модель не будет иметь никакой логики уведомлений, только данные и бизнес-логика. Мое первое впечатление состоит в том, что виртуальная машина обернет свойства модели и позаботится о уведомлениях.

Я с готовностью признаю, что реализация этих интерфейсов в Модели может упростить реализацию во многих случаях, но я ищу объяснение того, почему модель должна отвечать за уведомления.

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

INPC является частью базовой структуры, в отличие, скажем, от ICommand и DependencyObject, которые конкретно принадлежат WPF.Был похожий вопрос относительно выставления IQueryable со слоя сервиса.Как и INPC, IQueryable является базовым классом фреймворка.Не использовать ни одну из них в попытке создать чистую модель - это излишне.

Еще хуже, что это вызывает дублирование (заставляя обертку виртуальной машины выставлять свойства просто для добавления уведомления об изменении свойства).

Наблюдаемая коллекция с другой стороны - это другой зверь.Обычно коллекции в доменной модели представляют отношения сущностей.Во многих случаях вы не можете контролировать их создание.Там нужно найти компромисс

1 голос
/ 14 сентября 2011

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

Если в модели используются ObservableCollection и INotifyPropertyChanged, изменения, внесенные в редактируемом View / ViewModel, будут видны и обновлены в недоступном для редактирования View / ViewModel.

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

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