Как сохранить логику представления от модели и бизнес-логику от модели представления в MVVM? - PullRequest
6 голосов
/ 23 мая 2009

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

В противном случае мне просто нужно было бы продублировать всю бизнес-логику в модели представления, чтобы убедиться, что все обновлено, и тогда какой смысл иметь модель?

Одна из хитрых вещей, которые у меня есть в моей модели, это свойство класса "Category". Вы можете думать об этом как о древовидной структуре, и все свойства являются потомками конечных узлов. Что ж, в модели это свойство генерируется на лету рекурсивно через всех его потомков, что все хорошо и хорошо. Однако модель представления должна привязываться к этому свойству и знать, когда оно изменяется. Должен ли я просто изменить модель, чтобы приспособить модель представления? Если я это сделаю, тогда модель представления на самом деле ничего не делает, модель вызывает все необходимые уведомления об изменениях, и представление может просто привязываться прямо к модели. Также, если бы у модели не было источника, как бы я обошел это?

1 Ответ

8 голосов
/ 23 мая 2009

Я не согласен с тем, что INotifyPropertyChanged и INotifyCollectionChanged зависят от пользовательского интерфейса. Они находятся в пространствах имен и сборках, которые не привязаны к какому-либо конкретному стеку пользовательского интерфейса. По этой причине я обычно устанавливаю такое поведение в системе как можно ниже (обычно на уровне данных).

Если есть какая-то причина, по которой вы не хотите ставить это на этом уровне, это нормально. Вы можете поместить его на более высокий уровень, такой как сервис или уровень пользовательского интерфейса. Однако вам необходимо убедиться, что все изменения в структурах данных происходят и через этот слой.

...