У меня есть реализация ICommand
, которая является автономной. Он изменяет информацию об объекте. Тот же объект привязан к View
, как свойство View's ViewModel
.Отзыв от ICommand
То, что я хочу достичь, - сущность (и, следовательно, ViewModel, следовательно - вид) для обновления новой информацией после выполнения команды. То, как я это понимаю, ICommand
-s - улица с односторонним движением. Они изменяют базовые данные, но не должны давать прямой результат.
Итак, я достиг этого, отправив Message
из командной строки в конце ее выполнения с использованием структуры MVVMLight. Модель просмотра, которая предоставляет объект, также подписывается на одно и то же сообщение и сама обновляется, когда сообщение получено (обновленная информация передается как свойство сообщения).
Дополнительным преимуществом является то, что другие модели просмотра также могут подписаться и реагировать на одно и то же событие. Тем не менее, «запахи» в этом заключается в том, что основой этой реализации является events
. Из того, что я прочитал, вся концепция событий не очень хорошо вписывается в шаблон MVVM. Или перекрестная VM-коммуникация в порядке, чтобы сделать это?
Пример:
Домен Модель
- пользователя
First Name
Last Name
Full Name { get { return First Name + Last Name } }
вид Модель
- User View Model - обернут вокруг
User Domain Model
, но не хранит экземпляр этогоstring First Name
string Last Name
string Full Name
(Примечание: Есть ли что-нибудь о том, как она рассчитывается не знаю)ICommand Change First Name
- Метод:
MapFromDomainModel(UserDomainModel)
. Вызывается, когда модель просмотра получает сообщениеUserDomainChanged
.
Команда
Change First Name : ICommand
- Изменяет
First Name
вUser Domain Model
- Посылает
UserDomainChanged(UserDomainModel)
сообщение
- Изменяет
Престол в этом примере вид Модель не знает, как Full Name
рассчитывается и не/не должен знать, что, когда First Name
изменяется, Full Name
должна быть изменена тоже. Вот почему команда работает непосредственно над моделью домена и запускает сообщение.
Кроме того, у меня могут быть другие представления в окне, которые имеют модели просмотра, привязанные к одной и той же модели пользовательского домена. Подписавшись на одно сообщение, они могут самостоятельно обновляться.
Это хороший подход? Есть ли лучший?
Я бы сказал, что этот подход полностью прекрасен. если вы не хотите добавить ссылку на viewmodel в свою команду или реализовать INotifyPropertyChanged на вашей сущности. – Jehof
Обычно я изменяю некоторые свойства в своих командах, а затем обновляет представление из-за NotifyPropertyChanges и соответствующих привязок. Будет ли это достаточно или у вас более сложный сценарий? – heltonbiker
@heltonbiker, поэтому ваша команда изменяет модель просмотра, а не базовую модель данных? Выполняемая мной команда выполняет постоянное изменение - против модели домена и из-за выполненной бизнес-логики другие свойства View Model могут измениться без знания Command или View Model. –