WP7 — Почему мои привязки не срабатывают при нажатии кнопки «Назад» в Windows?

Надеюсь, на это есть очевидный ответ, который мой мозг в 2 часа ночи не видит (я основываюсь на том факте, что не могу найти никого с такой же проблемой).

Когда я нажимаю кнопку «аппаратное/встроенное» назад на своем телефоне с Windows 7, ни одна из моих привязок не переоценивается. Например, на моей главной странице у меня есть кнопка «IsEnabled», привязанная к логическому свойству в моей ViewModel, которое проверяет, находится ли значение в изолированном хранилище. В эмуляторе он запускается как отключенный (очевидно). Затем я перехожу на другую страницу и добавляю требуемое значение в изолированное хранилище. Когда я нажимаю аппаратную кнопку «Назад», чтобы вернуться на исходную страницу, привязка не оценивается повторно, и моя кнопка остается отключенной.

Однако, если я вернусь к MainPage через код, используя метод навигации, привязка будет переоценена, и все будет хорошо.

Есть идеи, почему?


person Nogusta    schedule 22.01.2011    source источник


Ответы (2)


Проблема звучит так, будто метод RaisePropertyChanged не вызывается вашей MVVM Light ViewModel — если вы привязываете метод доступа Get{} вашего свойства IsEnabled в модели представления непосредственно к значению в IsolatedStorage, тогда ViewModel не узнает что это базовое значение обязательно изменилось.

Когда вы записываете значение в IsolatedStorage, вы можете использовать интерфейс Messenger в MVVM, чтобы уведомить рассматриваемую ViewModel о том, что она должна запустить событие RaisePropertyChanged() для вашей модели, и это повторно привяжет это свойство к вашему представлению.

person Aaronontheweb    schedule 22.01.2011
comment
Хммм, это было первое, что я собирался попробовать, потому что в основном мне нужно RaisePropertyChanged из другой ViewModel в ту, которая в этом нуждается. Я этого не сделал, потому что навигация работала, а кнопка «Назад» не работала, плюс я не сохраняю свои ViewModels, как в стандартной реализации MVVM-light, поэтому я предположил, что ее не будет для получения сообщения. Я попробую и дам вам знать - person Nogusta; 23.01.2011
comment
Хорошо, это сработало, но у меня осталось больше вопросов. Переход к представлению с помощью кода вызывает вызов моего конструктора ViewModel, а переход с помощью кнопки «Назад» - нет. Почему это? Сохраняет ли WP7 ссылку на мой вид и ViewModel? Если да, то как мне избавиться от ViewModel, когда представление удалено, поэтому я не храню большие коллекции в памяти? - person Nogusta; 23.01.2011
comment
Нажатие кнопки «Назад», кажется, просто возвращает исходный вид, как это было. Мое свойство ViewModelLocator, которое предоставляет ViewModel, даже не нажимается при нажатии кнопки «Назад». - person Nogusta; 23.01.2011
comment
Все ViewModels в традиционных реализациях MVVM Light являются статическими. Они инициализируются только один раз для каждого приложения, если только вы не внесли существенные изменения в ViewModelLocator или вообще не используете его. - person Aaronontheweb; 24.01.2011
comment
Работа обратного стека заключается в том, что он попытается извлечь VisualState ваших страниц из кэша, поэтому он не обязательно повторно запускает все привязки соответствующим образом. Если поведение обратного стека по умолчанию вызывает некоторые проблемы, вы можете обработать события обратного стека и вручную управлять некоторым поведением привязки в своих представлениях. Использование интерфейса мессенджера для отображения событий привязки / навигации — относительно простой способ сделать это. - person Aaronontheweb; 24.01.2011
comment
Спасибо, да, я написал свой собственный локатор модели представления, используя ninject (просто пробуя разные вещи). Это было поведение заднего стека, доставляющее мне горе. - person Nogusta; 07.02.2011

Когда вы используете метод NavigationService.Navigate, вы фактически выполняете навигацию вперед, и создается новый экземпляр вашей страницы. При нажатии аппаратной кнопки «Назад» выполняется назад переход и повторно отображается предыдущая страница. Почти все время вы получаете кэшированную версию исходного экземпляра страницы.

Вы можете переоценить любые привязки в переопределении OnNavigatedTo для страницы, но это вносит изрядную долю «запаха кода». Как упоминалось выше, использование Messenger позволит вам обновить связанную модель представления, которая обновит привязку на странице.

person Derek Lakin    schedule 24.01.2011