Как вы исключаете логику представления из модели и бизнес-логику из view-модели в MVVM?

StackOverflow https://stackoverflow.com/questions/900991

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top