После выполнения нескольких проектов с использованием шаблона MVVM Im все еще борется с ролью ViewModel:
Что я делал в прошлом: Использование модели только в качестве контейнера данных. Ввод логики для управления данными в ViewModel. (Это бизнес-логика?) Con: Логика не может использоваться повторно.
Что я сейчас делаю: Удерживая ViewModel как можно более тонким. Перемещение всей логики в слой модели. Только сохранение представления Логика в ViewModel. Con: делает уведомление пользовательского интерфейса очень болезненным, если данные изменяются внутри слоя модели.
Итак, я дам вам пример, чтобы сделать его более понятным:
Сценарий: Инструмент для переименования файлов. Классы: Файл: представление каждого файла; Правило: содержит логику, как переименовывать файл;
Если Im следующий подход 1: Создание ViewModel для файла, правила и представления → RenamerViewModel. Ввод всей логики в RenamerViewModel: Содержит список FileViewModel и RuleViewModel и продолжающуюся логику. Легко и быстро, но не может использоваться повторно.
Если Im следующий подход 2: Создание нового класса модели → Renamer, который содержит список файлов, правило и продолжающуюся логику для взаимодействия с каждым файлом и применения каждого правила. Создание ViewModel для файла, правила и Renamer. Теперь RenamerViewModel содержит только экземпляр Renamer Model и два ObservableCollections для переноса списка файлов и правил Renamer. Но вся логика находится в модели Renamer. Поэтому, если модель Renamer запускается для управления некоторыми данными по вызовам метода, в ViewModel нет ключа, с помощью которого данные обрабатываются. Поскольку модель не содержит никакого уведомления PropertyChange, и я избегу этого. Таким образом, бизнес и презентационная логика разделены, но это затрудняет уведомление пользовательского интерфейса.