Я пишу приложение WP7, которое восстанавливает свое состояние в главном потоке пользовательского интерфейса в обработчике переопределения OnNavigatedTo () на своей странице. В этом обработчике он устанавливает для свойства ListSource списка страниц десериализованную коллекцию ObservableCollection элементов данных. Десериализация происходит из изолированного хранилища и достаточно быстра, чтобы не зависать.
Однако, когда появляется страница, список пуст. После установки точки останова и проверки состояния страницы свойство Items заполняется правильно и не является пустым.
Если я задерживаю настройки свойства ItemsSource следующим образом:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
int delayMs = 100; // Why 100 ?
runDelayedDispatch(Deployment.Current.Dispatcher,
delayMs, delegate()
{
deserializeFromStorageAndSetItemsSource();
});
}
...
// Does a BeginInvoke() after the specified delay.
public static void runDelayedDispatch(Dispatcher dispatcher,
int delayInMilliseconds, Action action)
{
Action dispatcherAction = delegate()
{
dispatcher.BeginInvoke(action);
};
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e) => Thread.Sleep(delayInMilliseconds);
worker.RunWorkerCompleted += (s, e) => dispatcherAction.Invoke();
worker.RunWorkerAsync();
}
Тогда все работает нормально.
Что я делаю не так? Должен ли я читать из изолированного хранилища другой обработчик или позднее в жизненном цикле приложения?
Статьи о жизненном цикле приложения не пролили свет на это: (
http://msdn.microsoft.com/en-us/library/system.windows.controls.page.onnavigatedto(v=vs.95).aspx
http://msdn.microsoft.com/en-us/library/cc838245(v=vs.95).aspx
http://windowsphonegeek.com/articles/WP7-Application-Lifecycle-and-Tombstoning
http://visualstudiomagazine.com/articles/2011/06/01/pcmob_app-lifecycle.aspx
Спасибо!