Я всегда был немного смущен относительно того, что «модель» должна или не должна содержать. Учебники и примеры часто противоречат друг другу. До сих пор я играл в это безопасно, мои модели разоблачали не что иное, как «материал UI», например. свойства для привязки к представлению, плюс логика проверки. Но приемлемо ли иметь в бизнесе другую бизнес-логику?Какова ответственность модели в MVVM?
Предположим, что я хочу управлять механическим насосом через веб-сервис, который обеспечивает методы включения насоса с заданной скоростью и его повторного включения. Мое представление пользовательского интерфейса может включать в себя «on» & кнопки «выключено», а также текстовое поле для установки скорости. Имея это в виду, моя модель может начать так: -
public class Pump
{
public int Speed { get; set; }
}
// The real thing would implement INotifyPropertyChanged, validation, etc.
это все, модель должна делать, или это приемлемо, чтобы выставить бизнес-логику для включения насоса и выключения - либо в качестве методов для вызова модели или, возможно, даже как ICommands, которые могут быть связаны непосредственно с кнопками вида? Или все это должно быть в представлении-модели?
Редактировать Не знаете, почему downvotes, как я думаю, это был вполне разумный вопрос. Хотя в Интернете есть много руководств и примеров MVVM, они часто предоставляют противоречивые советы относительно того, что происходит, как и ответы, приведенные ниже. Я даже закончил читать электронную книгу «Advanced MVVM» экспертом WPF Джошем Смитом - в книге не упоминалось моделей вообще!
В любом случае, я нашел хороший ресурс here для тех, кто хочет подчинить структуру MVVM. В то время как ссылка выводит вас в документацию для платформы Prism от Microsoft, эта конкретная страница посвящена структуре MVVM с небольшой или отсутствующей спецификацией Prism. Я нашел страницу очень информативной и, по крайней мере, успокоился, подтвердив, что то, что я делал за последние пару лет, было совершенно корректным, то есть иметь модели, которые реализуют INPC и проверку (IDataErrorInfo) , и привязывать эти модели непосредственно к представлению через свойства VM (а не дублировать свойства модели в VM, как некоторые ответы ниже).
Я очень согласен с этим Jimmy – AlSki
Спасибо за ответ. Возможно, «насос» был не очень хорошим примером - что, если бы у меня была более сложная модель со многими свойствами, например. клиент? То, как я делал до сих пор, заключается в том, чтобы модель реализовала INPC и выставляла ее в представление через одно свойство в VM, позволяя виду привязываться к свойствам модели (например, «{Binding Customer.Forename» " Вы предлагаете подвергать каждое свойство модели через наблюдаемое свойство на виртуальной машине - не связано ли это с большим количеством дублирования свойств, кода сопоставления и т. Д. –
@AndrewStephens: Я заметил в другом комментарии, что вы упоминаете, что используете свой подход * в течение многих лет * .Это EOT IMO.Если это работает для вас так, как вы это делаете, зачем это менять? В конце концов, это всего лишь ** рекомендация ** (как и большинство материалов в разработке программного обеспечения). Моя команда имела прямо противоположную опыт - наш домен (и модель) вырос до такой степени, что этот подход стал очень проблематичным для решения. Позднее проекты мы пошли на более идиоматический MVVM, и с ним было здорово работать. YMMV. –