我在这里看到了许多与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之前发生,这意味着不必要的重新绘制和什么不是。
答案 0 :(得分:3)
我通常直接在XAML中绑定到ViewModel。然后在OnNavigatedTo我触发视图模型以获取其数据异步。
这允许我从开始(页面标题等)显示基本值。然后,当我开始获取数据时,我还可以直接在ViewModel中激活进度条,然后在获取数据后将其删除。
答案 1 :(得分:1)
我建议您异步加载数据。 OnNavigatedTo
是您可以开始加载的地方。如果您正在谈论用户几乎肯定要导航到的页面,那么您可以提前开始加载。
我有一个series of blog posts,看看async
与传统OOP有何摩擦。有几篇文章特别关注数据绑定,例如asynchronous construction(关于异步初始化的部分)和asynchronous properties(关于数据绑定的部分)。
就在几个小时前,我宣布了我的AsyncEx库的第一个稳定版本,其中包括NotifyTaskCompletion
types,您可以使用它来启动异步加载操作并让您的视图自动响应(通过数据绑定)它完成了。
但是回到核心问题:在加载数据时你必须显示某些东西。我建议您不要将此视为“不必要”,而应将其视为提供更好用户体验的机会。想想你在慢速手机上看到的想要你的应用程序是什么样的,或者加载数据时出错。任何时候有I / O,设计“加载...”和“错误”状态以及“加载”状态。