添加到ObservableCollection的项目在Navigate上丢失

时间:2016-07-29 00:44:38

标签: uwp observablecollection template10

从Template10汉堡包模板开始,我有一个典型的主/细节方案来管理食谱。数据结构是RecipeBox包含RecipeGroups,其中包含Recipes。这里有一些UI可以让您更好地了解:

RecipeMaster UI

我有一个AppBarButton链接到一个方法,可以将新配方添加到集合中。这是一个非常简单的方法:

private async Task createNewRecipe()
{
    NewNamedItemDialog dialog = new NewNamedItemDialog("Enter New Recipe Name");
    await dialog.ShowAsync();

    Recipe newRecipe = new Recipe(dialog.TextEntry);            
    currentGroup.Recipes.Add(newRecipe);
    SelectedRecipe = newRecipe;

   // goToRecipeView();
}

注意我已经评论了最后一行。当它处于播放状态时,NavigationService.Navigate(typeof(DetailPage), newRecipe)将使用新的Recipe对象正确显示详细视图,但不会更新该集合。当我从DetailView返回时,配方尚未添加到组中。只需禁用即时导航即可正确更新ObservableCollection<RecipeGroup>

如何触发更新集合并仍然执行即时导航以编辑我的新项目?

为什么NavigationService.Navigate会中断本地对象的更新?

!!!更新了以下部分!!!

这是一个简单的例子,展示了我在这个领域缺乏知识。这个项目有一个简单的Key-Value类,起始页面显示了在启动应用程序时创建的简单列表:

Sample Project

当应用程序启动时,它会在GridView中显示两个项目,您可以选择一个进行编辑,也可以添加一个新项目(直接将您带到DetailPage进行编辑)。

Start Grid View

DetailPage只显示一个TextBox来编辑值:

Detail Page View

由于我处理了AppBarButton的点击,我可以将选定的DataItem作为参数传递给DetailPage。这提出了我仍在努力解决的这些问题。

  1. 我可以将信息作为参数传递给NavigationService.Navigate(),因此在浏览方法时我声明我可以传递数据 - 但是当用户点击后退按钮时该怎么做?我尝试了类似的方法,在OnNavigatingFrom()中添加参数而没有太多运气。

  2. Jerry已经声明in this post,用于传递参数的序列化服务的大小限制大约为8 Kb,当然有些对象没有很好地序列化。他推荐了一个“会话缓存”来处理这种不会给我敲钟声的情况。在UWP应用程序中的页面之间传递大型或复杂对象的建议最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

事实上,尼克松先生在this post清除了这一点,对不起,我早就找不到了。

它并没有完全回答我原来的问题,但它为我提供了足够的信息来解决这个问题。