Я использую 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 (() => {// делать что угодно))