我应该何时在Windows Phone 8应用程序中加载数据?

时间:2013-05-15 17:34:02

标签: windows-phone-8 windows-phone

我在这里看到了许多与OnNavigatedTo方法相关的问题,但它们似乎都没有回答基本问题:“我应该在什么时候加载数据?”据我所知,MSDN上的文档没有明确回答这个问题。

如果我需要从本地数据库加载数据列表,哪种方法最适合使用?我应该使用OnNavigatedTo方法还是Loaded事件?

到目前为止我一直在使用的是这种模式,它似乎运作良好:

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

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

这意味着对于页面的新实例,同步加载数据。这也意味着在数据加载完毕并且探查器抱怨我使用过多的UI线程时,页面将不会呈现。

另一种方法是这种模式:

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

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

但是对于这种模式,在我看来导航,因此页面渲染可能在我加载数据和设置DataContext之前发生,这意味着不必要的重新绘制和什么不是。

2 个答案:

答案 0 :(得分:3)

我通常直接在XAML中绑定到ViewModel。然后在OnNavigatedTo我触发视图模型以获取其数据异步。

这允许我从开始(页面标题等)显示基本值。然后,当我开始获取数据时,我还可以直接在ViewModel中激活进度条,然后在获取数据后将其删除。

答案 1 :(得分:1)

我建议您异步加载数据。 OnNavigatedTo是您可以开始加载的地方。如果您正在谈论用户几乎肯定要导航到的页面,那么您可以提前开始加载。

我有一个series of blog posts,看看async与传统OOP有何摩擦。有几篇文章特别关注数据绑定,例如asynchronous construction(关于异步初始化的部分)和asynchronous properties(关于数据绑定的部分)。

就在几个小时前,我宣布了我的AsyncEx库的第一个稳定版本,其中包括NotifyTaskCompletion types,您可以使用它来启动异步加载操作并让您的视图自动响应(通过数据绑定)它完成了。

但是回到核心问题:在加载数据时你必须显示某些东西。我建议您不要将此视为“不必要”,而应将其视为提供更好用户体验的机会。想想你在慢速手机上看到的想要你的应用程序是什么样的,或者加载数据时出错。任何时候有I / O,设计“加载...”和“错误”状态以及“加载”状态。