Windows Phone 7: MVVMLight и Messenger

#database #windows-phone-7 #mvvm #mvvm-light #windows-phone

#База данных #windows-phone-7 #mvvm #mvvm-light #windows-phone

Вопрос:

Я пытаюсь заставить MVVMLight работать на Windows Phone 7 и у меня небольшая проблема с пониманием парадигмы.

Сценарий, которому, я думаю, следует следовать: 1.) При загрузке модели основного представления через MVVM Light Messenger отправляется сообщение для проверки наличия базы данных 2.) Сообщение принимается ViewModel, и если базы данных нет, сообщение отправляется обратно в представление через messenger, чтобы показать представление установки (для перехода к нему) 3.) Представление установщика отображается в первом представлении

Проблема, по-видимому, заключается в порядке вызова событий. Представление успешно проверяет наличие базы данных и отправляет сообщение, но viewmodel еще не инициализирован (точка останова в конструкторе не нажата при отправке сообщения), поэтому форма не отображается. Правильно ли я с этим справляюсь или мне следует просто проверить наличие базы данных в представлении?

Ответ №1:

Messenger может отправлять сообщения только объектам, которые существуют в памяти (кстати, я рассматриваю возможность добавления какого-нибудь решения для «автономного обмена сообщениями», но на самом деле это всего лишь видение, пока даже не план).

В MVVM Light то, как виртуальная машина подключена к представлению в XAML, приводит к тому, что виртуальная машина будет запущена очень рано (как только в исходном коде будет задан параметр InitializeComponent). Если вам нужно, чтобы виртуальная машина была создана ранее, вы можете сделать это в ViewModelLocator. Я собираюсь показать это на своей сессии MIX11 (Deep Dive MVVM), поэтому проверьте видео, когда оно будет опубликовано (я упомяну об этом в своем блоге http://blog.galasoft.ch).

Если вы не используете способ MVVM Light для привязки представления и виртуальной машины, а виртуальная машина еще не существует в памяти, одним из способов является «кэширование» сообщения на потом. Создайте облегченный объект, который существует исключительно с целью получения сообщения и его хранения. Затем, когда виртуальная машина будет создана, извлеките сообщение. если хотите, это очередь сообщений.

Я надеюсь, что это поможет, Лоран

Комментарии:

1. Я обнаружил, что способ создания виртуальной машины ранее, как упоминал Лоран, заключается в использовании другого конструктора при регистрации виртуальной машины: SimpleIoC.Default. Зарегистрируйте <ContactViewModel> (true) флаг true устанавливает его для немедленной инициализации.