Выбор между связанными свойствами ViewModel или обменом сообщениями для обмена данными между ViewModel и View с помощью легкого инструментария MVVM - PullRequest
1 голос
/ 23 октября 2010

Я использую инструментарий MVVM Light (который я люблю).В настоящее время у меня есть сообщения для некоторых взаимодействий, происходящих из ViewModel и предназначенных для потребления представлением.Обычно сообщения такого типа указывают, что представление должно что-то делать, например скрывать себя, показывать подтверждающее сообщение о сохранении данных и т. Д.

Это работает.В конструкторе для View я регистрируюсь в Messenger:

Messenger.Default.Register<NotificationMessage<PaperNotification>>(this, n => HandlePaperNotification(n));

Когда я использую Messenger для передачи сквозных вопросов между ViewModel (например, идентификацией), я вижу, что когда ViewModelочищенный в ViewModelLocator, базовый класс для ViewModels (ViewModelBase) отменяет регистрацию любых подписанных сообщений.Мне не нужно ничего делать, так как MVVM Light Toolkit справляется с этим для меня.Однако, когда я использую их в представлениях, я должен явно отменить их регистрацию во время закрытия, например, так:

Messenger.Default.Unregister(this);

Я полагаю, я мог бы реализовать базовый класс для наследования представлений.

Однако меня поражает, что, возможно, это запах кода при использовании Messenger в View ... он работает, но это может быть не лучшим способом.Мне интересно, нужно ли мне вместо этого создать свойство в ViewModel и связать с ним любую часть элементов View.В примере сокрытия формы свойство может быть логическим значением с именем «Показать».Размышляя об этом, я вижу, что во многих случаях это приводит к необходимости создания ValueConverter.Один способ кажется менее проверяемым.Другой способ, по-видимому, требует гораздо больше кода и, возможно, введения избыточных ValueConverters, которые могут стать запахом кода сами по себе.

Итак (после всего этого) мой вопрос таков:

Является ли предпочтительным использование сообщений в представлении или лучше добавить свойства (и, возможно, ValueConverters), чтобы позволить ViewModel управлять им более привязываемым образом?

Ответы [ 3 ]

3 голосов
/ 23 октября 2010

В МВВМ. ViewModel соединяется с View через DataBinding и командами. Если вам нужны какие-то другие функции, вам нужно реализовать их с помощью этого средства. Обмен сообщениями должен быть только для ViewModels. Предполагается, что представления являются «глупыми» визуализаторами ваших данных во ViewModel.

1 голос
/ 23 октября 2010

Логика обмена сообщениями в MVVM Light предназначена для связи между ViewModels. Я никогда не сталкивался с какой-либо связью между View и ViewModel, которую не мог бы решить с помощью привязки и / или команд. Иногда мне нужны преобразователи значений, а иногда мне нужен код в выделенном фрагменте кода, но мне никогда не приходилось заставлять ViewModel напрямую передавать данные в View.

0 голосов
/ 16 ноября 2013

Это интересное обсуждение, и я нашел эту ветку, когда мне было интересно узнать о модели представления для просмотра связи.Интересно, что создатель MVVMLight, похоже, считает вполне приемлемым приемлемо отправлять сообщения из модели представления в представление .Еще один пример различных мнений о том, что такое хороший дизайн MVVM.

...