2013-05-15 3 views
1

Я видел много вопросов, связанных с методом OnNavigatedTo, но ни один из них, похоже, не ответил на основной вопрос: «В какой момент я должен загружать данные?» Насколько я могу судить по документации на MSDN, явным образом не отвечаю на этот вопрос.Когда я должен загружать данные в приложение Windows Phone 8?

Если мне нужно загрузить список данных из локальной базы данных, какой метод наиболее подходит для использования? Должен ли я использовать метод OnNavigatedTo или событие Loaded?

Что я использую до сих пор эта картина, которая, кажется, работает хорошо:

protected override void OnNavigatedTo(NavigationEventArgs e) { 
    base.OnNavigatedTo(e); 

    if (NavigationMode.New == e.NavigationMode) { 
     var data = LoadData(); 
     this.DataContext = data; 
    } 
} 

Что это означает, что для нового экземпляра страницы, загружать данные синхронно. Это также означает, что страница не будет отображаться до тех пор, пока данные не закончит загрузку, а профилировщик жалуется, что я использую слишком много времени для потока пользовательского интерфейса.

Альтернативный подход заключается эта картина:

protected override async void OnNavigatedTo(NavigationEventArgs e) { 
    base.OnNavigatedTo(e); 

    if (NavigationMode.New == e.NavigationMode) { 
     var data = await LoadData(); 
     this.DataContext = data; 
    } 
} 

Но с этим рисунком, мне кажется, что навигация, и поэтому рендеринг страницы может происходить до загрузки данных и установить DataContext, то есть ненужными перекраски и что-нет.

ответ

3

Я обычно привязываюсь к ViewModel непосредственно в XAML. Затем в OnNavigatedTo я запускаю модель представления для извлечения данных async.

Это позволяет мне показывать основные значения с начала (название страницы и т. Д.). Затем, когда я начинаю получать данные, я также могу активировать панель прогресса непосредственно в ViewModel, а затем удалить ее после получения данных.

+0

Но если я загружаю данные только из локальной базы данных, где время для загрузки данных очень короткое, все же желательно показать экран «Загрузка ...»? Я не уверен, что очень короткая вспышка экрана загрузки предпочтительнее в этом случае. –

+0

Всегда ли это очень короткое время, и как короткий «очень короткий»? Если мы говорим о 100 мс, вы можете пропустить индикатор прогресса и просто обработать его async, не показывая никакого прогресса. – vonLochow

1

Я рекомендую вам загружать данные асинхронно. OnNavigatedTo - это одно место, где вы можете начать загрузку. Если вы говорите о странице, к которой пользователь почти наверняка будет ориентироваться, вы можете начать загрузку ранее.

У меня есть series of blog posts, которые смотрят, как async имеет некоторое трение с традиционным ООП. Есть несколько сообщений, которые смотрят на привязку данных, в частности, например, asynchronous construction (раздел о асинхронной инициализации) и asynchronous properties (раздел о привязке данных).

Всего несколько часов назад я анонсировал первый стабильный выпуск для моей библиотеки AsyncEx, который включает в себя NotifyTaskCompletion types, который вы можете использовать для запуска асинхронной операции загрузки и автоматически реагировать на ваше мнение (через привязку данных) по завершении.

Но вернемся к основной проблеме: вам нужно показать что-то во время загрузки данных. Я рекомендую вам не считать это «лишним», а скорее признавать его как возможность обеспечить лучший пользовательский интерфейс. Подумайте о том, что вы хотите ваше приложение должно выглядеть как на более медленном телефоне, или если есть ошибка при загрузке данных. В любое время есть I/O, дизайн состояния «Загрузка ...» и «Ошибка», а также состояние «Загружено».

Смежные вопросы