Нет ничего плохого в том, чтобы помещать логику в геттеры в виртуальных машинах - роль виртуальной машины состоит в том, чтобы представлять данные представлению, и оно должно быть как можно более готовым к просмотру (представление не должно делать это слишком) большая (если таковая имеется) работа по формированию данных перед их отображением).
В качестве примера я использую свойства под названием GetAvailableClients
в моей виртуальной машине, и это будет одно из свойств, с которыми привязывается View. Задача этого конкретного геттера - фильтровать данные - IOW представляет сокращенный набор данных, выбранных из полного списка (который также хранится в ВМ), эти данные обычно фильтруются с использованием LINQ, что означает, что я поместил некоторую пользовательскую логику в гетто.
Хотя я не являюсь поклонником остального вашего подхода, где, если свойство не было заполнено, оно отправляется в хранилище и получает сами данные. Для меня это нет-нет, собственность полностью нарушает принцип единоличной ответственности , делая собственность ответственной за слишком много. Не говоря уже о том, что не рекомендуется следовать, как только вы начнете связывать это свойство с пользовательским интерфейсом - внезапно ваше приложение начнет зависать, когда пользователь выполняет действие, потому что ваш получатель свойства был запущен, и он решил сделать вызов базы данных или веб-службы, и, что еще хуже, этот вызов был выполнен в потоке пользовательского интерфейса .... это просто уродливо.