2014-01-08 28 views
0

我是新的Windows商店应用程序开发,目前我正在开发一个新闻应用程序,我想刷新页面以获取新闻更新。我说开发一个项目时给我们的默认布局,我迷失在页面字典中,因为一旦创建页面。它得到保存,所以有刷新页面的方法!当应用程序第一次运行时调用LoadState方法,当点击刷新时,视图变得清晰,但根据我的知识将所有数据保存在字典中有一种简单的方法来清除组内的数据并调用方法,以便新的数据将得到填补in.can有人请指导我有关步骤窗口商店应用程序页面刷新

protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState) 
    { 
     var sampleDataGroups = SampleDataSource.GetGroups((String)navigationParameter); 
     this.DefaultViewModel["Groups"] = sampleDataGroups; 
    } 

    private void refresh(object sender, RoutedEventArgs e) 
    { 
     this.DefaultViewModel.Clear(); 

    } 

回答

0

如何:

private string parameter; 

protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState) 
{ 
    parameter = (string)navigationParameter; 
    reloadData(); 
} 

private void reloadData() 
{ 
    var sampleDataGroups = SampleDataSource.GetGroups(parameter); 
    this.DefaultViewModel["Groups"] = sampleDataGroups; 
} 

private void refresh(object sender, RoutedEventArgs e) 
{ 
    reloadData() 
} 
+0

我想刷新数据组中的数据数据取自贾森,我已经创建了一个清单列表中它包含数据,如下所示是一个示例代码 – user2955262

+0

group2.Items.Add(new SampleDataItem(“LatestNewsSmall-Group -2), news.TopNewsGivenCat [0] .title.ToString()。Replace(@“\”,“ - ”), time(news.TopNewsGivenCat [0] .lastUpdated.ToString()) , checkimage(新闻。TopNewsGivenCat [0] .image.ToString()), news.TopNewsGivenCat [0] .contents.ToString(), news.TopNewsGivenCat [0] .contents.ToString()。Replace(@“\”,“ - ” ), ,50,50, group2)); – user2955262

+0

在重新加载数据而不是页面加载时做到这一点。 – Bas

2

没有出色的回答这个问题。但让我通过一些概念来谈谈你。当然,没有更新,其原因有很多。有一天刷新可能会被添加到框架中,但现在有问题。

考虑导航服务

在你的应用程序中导航的一个好方法是对这项工作卸载到的NavigationService类。这是一个简单的类,它具有(类似于)自定义GotoAppHub()GotoItemDetail(Item)方法。

这些方法的目的不是因为导航困难,这是因为导航可以集中。它可以检查&创建Frame;而不是将此错误留在App.xaml.cs中。

如果你的视图模型想要导航到一个页面,它只需调用NavigationService.GotoItemDetail(item);来完成它,传递该项目。这很明智,有几个原因,让我通过他们谈谈你。

这很聪明的第一个原因是因为你根本不想浏览。在某些情况下,导航依赖于正在加载的数据或具有权限的用户。使用导航服务,您可以集中导航逻辑和验证操作所需的测试。

这是聪明的第二个原因是它允许您保留传递给导航请求的参数。请记住,Frame不会序列化自定义复杂类型。因此,在这种情况下通过item是不好的做法。导航服务可以将此参数保存在某个位置,以便目标视图模型可以将其提取出来。而且,它可以为你的Refresh()持久化。

考虑静态的仓储类

当加载一个视图模型,它应该是没有必要为它知道一个视图模式导致它加载。相反,视图模型应该知道它应该做什么。要完成它的工作,它需要数据。每个视图模型都可以使用存储库类来请求“当前”记录。导航发生时,当前记录将由导航服务设置。另外,当没有当前记录时,存储库类会知道该如何处理,并在需要时提取它。

除了保存对当前记录的引用之外,存储库类还可以理解持久性。我的意思是,当应用程序加载时,它知道如何填充列表。当应用程序被暂停时,它知道如何将数据保存到文件或Web服务或任何您使用的内容。因此,视图模型不知道这一点,因此更简单且更易于维护。

考虑刷新()方法

它是在你需要重载方法的导航服务。甚至更重要的是,只有在导航服务中,由于导航服务知道当前的type和当前参数值,所以重载方法可以是最有效的。导航服务可以将这些值存储在本地字段中,并且重载方法可以简单地重复导航。

但是请记住背部堆叠。这就像浏览器的导航一样,重复导航将意味着同一页面将存在两次,并且您的导航服务中的GoBack()方法在返回两次后才会返回。解决方法很简单,只需记住用Services.NavigationService.Instance.Frame.BackStack.Remove()删除。

记得装成本

有时在页面加载时存在加载UI相当大的成本。这是因为无论你做什么都不是微不足道的。调用Reload()将导致重复页面的加载。这是你无法克服的成本。但是,可能会依赖于应该绕过的页面加载。例如,您可以在加载页面时启动Web服务操作 - 并且不应该重复该操作。这取决于你保留一个静态布尔值,表明该页面已经加载。但重要的是你不要忘记它。

还有一个仓库的好处

几段上面我提到你的导航服务是可以记住的重载方法工作的最后一个传递的参数之一。如果你有一个内部规则,只有导航服务可以写入并发类,那么你的导航服务并不需要记住。它只需要记住最后的导航类型。这是因为并发类将已经引用传入的项目。但是,这并不总是有用的。有时会调用reload来丢弃当前更改,这意味着当前项目需要重新加载或当前更改必须刷新。这一切都必须是习惯性的,但如果我至少没有提及它,我会感觉不好。

结论

这应该只被视为一项建议。话虽如此,我在这里描述了市场上大量成功的WPF和Windows应用程序。使用MVVP模式,用于导航的服务模式,用于并发的存储库模式 - 这一切都得到了很好的证明。但你是开发者。最后,你应该选择最好的。

如果你不喜欢任何的,你可以这样做:

public bool Reload() 
{ 
    if (!this.Frame.BackStack.Any()) 
     return false; 
    var current = this.Frame.BackStack.First(); 
    this.Frame.BackStack.Remove(current); 
    return this.Frame.Navigate(current.SourcePageType, current.Parameter); 
} 

祝您好运!

相关问题