Элемент, добавленный в ObservableCollection, потерян при навигации

Начиная с шаблона Template10 Hamburger, у меня есть типичный сценарий master/detail для управления рецептами. Структура данных RecipeBox содержит RecipeGroups, которые содержат рецепты. Вот немного пользовательского интерфейса, чтобы дать вам лучшее представление:

Пользовательский интерфейс RecipeMaster

У меня есть 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, и на начальной странице отображается простой их список, который создается при запуске приложения:

Пример проекта

Когда приложение запускается, оно показывает два элемента в GridView, вы можете выбрать один для редактирования или добавить новый (что приведет вас непосредственно к странице DetailPage для редактирования).

Начать представление сетки

DetailPage просто отображает TextBox для редактирования значения:

Подробный просмотр страницы

Поскольку я обрабатываю щелчок AppBarButton, я могу передать выбранный DataItem в DetailPage в качестве параметра. Это поднимает эти вопросы, над решением которых я все еще работаю.

  1. Я могу передавать информацию в качестве параметров в NavigationService.Navigate(), поэтому при навигации по методам я объявляю, что могу передавать данные, но как мне это сделать, когда пользователь нажимает кнопку «Назад»? Я пробовал аналогичные подходы, добавляя параметры в OnNavigatingFrom() без особой удачи.

  2. Джерри заявил в этом сообщении, что служба сериализации, используемая для передачи параметров, имеет ограничение размера около 8 КБ, и, конечно, некоторые объекты плохо сериализуются. Он порекомендовал «сеансовый кеш» для работы с такими ситуациями, что мне не звонит в колокольчик. Что рекомендуется для передачи больших или сложных объектов между страницами в приложении UWP?


person Craig Colomb    schedule 29.07.2016    source источник
comment
Состояние приложения/страницы, SQLite, файл JSON - все жизнеспособные решения .... Службы настройки ада с ObservableCollection<RecipeGroup> будут работать. Думайте об этом как о функции уровня комфорта со сложностью... Очевидно, что SQLite, вероятно, будет излишним.   -  person mvermef    schedule 31.07.2016
comment
У меня есть служба для сохранения данных в файлы Json, моя проблема связана с обновлением объектов времени выполнения, Template10 NavigationService, похоже, прерывает это.   -  person Craig Colomb    schedule 01.08.2016
comment
С кодом, который вы разместили, трудно сказать, почему у вас возникла эта проблема. Не могли бы вы поделиться более подробной информацией, например, где вы определяете ObservableCollection и как вы используете его с методом createNewRecipe? минимально воспроизводимый пример был бы лучше.   -  person Jay Zuo    schedule 01.08.2016


Ответы (1)


На самом деле г-н Никсон прояснил это в этом сообщении , жаль, что я не нашел его раньше.

Это не полностью отвечает на мой первоначальный вопрос, но дает мне достаточно информации, чтобы обойти эту проблему.

person Craig Colomb    schedule 08.08.2016