MVVM Легкий инструментарий tombstoning + DispatchHelper - PullRequest
2 голосов
/ 04 февраля 2012

Я использую DispatcherHelper из источника света MVVM в методе NotifyPropertyChanged в моем ViewModel для маршалинга вызовов в потоке пользовательского интерфейса.В моем Application_Launching я инициализирую Dispatcher следующим образом:

DispatcherHelper.Initialize();

Я также добавляю то же самое в Application_Activation

Когда надгробные плиты приложения я сохраняю свою виртуальную машину в словаре "State".Когда приложение реактивируется из захороненного состояния, платформа, кажется, сначала выполняет десериализацию моего ViewModel перед запуском Application_Activation.В рамках десериализации устанавливаются свойства ViewModel, которые в свою очередь вызывают метод NotifyProperyChanged в модели представления.Это, в свою очередь, вызывает DispatcherHelper, но поскольку метод «Initialize» не был вызван, MVVM Light выдает «исключение нулевой ссылки»

Так что вопрос в том, где мне сделать вызов DispatcherHelper.Initialize () здесь.

РЕДАКТИРОВАТЬ 1 Я заметил, что если я сохраню свою виртуальную машину в обработчике «Application_Deactivation»

PhoneApplicationService.Current.State[viewModelKey] = ViewModel;

, а затем вернусь в приложение, чтобы активировать ее, я вижуследующие вызовы в «представлении стека вызовов» с включенным «Показать внешний код»

Microsoft.Phone.dll!Microsoft.Phone.Shell.StreamPersister.Deserialize(byte[] blob, System.Collections.Generic.IEnumerable<System.Type> knownTypes, ref System.Collections.Generic.IDictionary<string,object> dictionary) + 0x20 bytes   

Microsoft.Phone.dll!Microsoft.Phone.Shell.StreamPersister.Load(Microsoft.Phone.Shell.Interop.ShellPageManager shellPageManager, string key, System.Collections.Generic.IEnumerable<System.Type> knownTypes, ref System.Collections.Generic.IDictionary<string,object> dictionary) + 0x28 bytes  

Microsoft.Phone.dll!Microsoft.Phone.Shell.PhoneApplicationService.FireActivated(bool isExecutionContextPreserved) + 0x30 bytes  
Microsoft.Phone.Interop.dll!Microsoft.Phone.Execution.NativeEmInterop.FireOnResume(bool isExecutionContextPreserved) + 0xc bytes    

Эти вызовы отсутствуют, если я не добавляю свою ViewModel в словарь состояний

РЕДАКТИРОВАТЬ 2: Если я заменим вызов DispatchHelper и заменим его стандартным Dispatcher.BeginInvoke, то проблема исчезнет.

CHANGE Deployment.Current.Dispatcher.BeginInvoke (() => {// делать что угодно})

В ЭТОМ DispatcherHelper.CheckBeginInvokeOnUI (() => {// делать что угодно))

...