Каков наилучший способ для ViewModel манипулировать View? - PullRequest
1 голос
/ 28 мая 2009

Я понимаю, что в шаблоне MVVM ViewModel ничего не должен знать о представлении .

Таким образом, кажется, двумя способами , что ViewModel может вызвать что-то особенное, что происходит в пользовательском интерфейсе , рассмотрим этот общий поток событий:

  • пользователь что-то вводит в текстовое поле
  • пользователь нажимает кнопку
  • вызывает DelegateCommand под названием «Сохранить» на модели представления
  • просмотр модели сохраняет текст из текстового поля
  • если во время сохранения все идет хорошо, модель представления меняет свое свойство INotifyPropertyChanged с именем SaveStatus на "Успешно"

Теперь в представлении у меня есть два способа разрешить этому изменению повлиять на пользовательский интерфейс :

  • в представлении может быть текстовый блок с конвертером , который преобразует текст SaveStatus в фразу типа "Сохранение выполнено успешно".
  • в представлении может быть Trigger , который проверяет, если SaveStatus = "Succeeded", и если это так, то серия сеттеров соответствующим образом изменяет интерфейс (скрывая изменение текста, изменение цвета и т. д.)

Это основной поток информации из ModelView в View , который вы используете в своих приложениях?

Ответы [ 3 ]

1 голос
/ 30 мая 2009

Вы также можете создавать пользовательские события в модели представления, чтобы представление подписывалось на них и реагировало соответствующим образом. Вам не нужно делать это очень часто, но это имеет больше смысла, чем проверка каждого события INotifyPropertyChanged для конкретных имен свойств.

0 голосов
/ 31 мая 2009

Это основной поток информации из ModelView в View, который вы используете в своих приложениях?

Да. Мы используем INotifyPropertyChanged почти исключительно для изменений из ViewModel в представление. Там, где взаимодействие немного сложнее, мы используем другие события, к которым подключается View.

Вместо свойства сообщения SaveStatus у нас есть логическое значение HasChanges для EditableAdapter, которое упаковывает наш POCO и обеспечивает фиксацию / откат изменений, а также другие вычисляемые свойства. Затем мы можем привязать наши представления к этому HasChanges, чтобы, например, мы могли отображать имя документа с * в конце, чтобы показать, что оно имеет изменения, или использовать HasChanges, чтобы отключить / включить кнопку Сохранить.

0 голосов
/ 28 мая 2009

Мы используем шаблон контроллера вида модели, поэтому он выглядит так:

  • пользователь что-то вводит в текстовое поле
  • пользователь нажимает кнопку сохранения
  • представление указывает контроллеру сохранить данные
  • контроллер сообщает представлению извлечь данные
  • контроллер сохраняет данные в модель
  • контроллер сигнализирует о том, что сохранение прошло успешно
  • вид показывает "Сохранение выполнено успешно"

Я думаю, что вы могли бы использовать почти такой же подход (единственное отличие было бы в том, что контроллер и модель были бы и моделью представления в вашем примере)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...