什么时候应该在Windows Phone 8应用程序中加载数据?

问题描述:

我在这里看到很多关于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; 
    } 
} 

这意味着,对于一个页面的新实例,同步加载数据。这也意味着,只有在数据加载完成后,页面才会被呈现,Profiler会抱怨我使用了太多的UI线程时间。

另一种方法是这样的模式:

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

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

但是,随着这种模式,这在我看来,导航,我已经加载的数据之前,可能会发生,因此页面渲染,并设置DataContext的,意思是不必要的重新涂料和什么不是。

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

这使我可以从开始(页面标题等)显示基本值。然后,当我开始提取数据时,我也可以直接在ViewModel中激活一个进度条,然后在提取数据后将其移除。

+0

但是,如果我只从加载数据的时间很短的本地数据库加载数据,是否仍然建议显示“正在加载...”屏幕?我不确定在这种情况下加载屏幕的简短闪光是否可取。 –

+0

它总是很短的时间,“很短”的时间有多短?如果我们谈论的是100毫秒,你可能想跳过进度条,只是在不显示任何进度的情况下处理它。 – vonLochow

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

我有一个series of blog posts是怎么看待async有一些摩擦与传统的面向对象编程。有几篇文章特别关注数据绑定,例如asynchronous construction(关于异步初始化的部分)和asynchronous properties(关于数据绑定的部分)。

就在几个小时前,我宣布我的AsyncEx库,其中包括NotifyTaskCompletion types,你可以用它来揭开序幕异步加载运行,并自动有你的观点回应(通过数据绑定),当它完成了第一个稳定版本。

但是回到核心问题:在数据加载的时候,您必须显示某些东西。我建议你不要认为这是“不必要的”,而是将其视为提供更好用户体验的机会。考虑一下你的想要你的应用看起来像是放在一个较慢的电话上,还是加载数据时出现错误。任何时候有I/O,设计“加载...”和“错误”状态以及“加载”状态。