locked
"Плата" за асинхронность RRS feed

  • Вопрос

  • Главное окно. В событии SelectionChanged в ListView в зависимости от выбранной позиции происходит наполнение коллекции, которая привязана к GridView. То есть меню категорий в ListView и список элементов на каждую категорию в GridView.

    При обычном запуске окна в момент установки списка ListView событие SelectionChanged срабатывает, а текущий индекс автоматом ставится 0 (первый элемент списка). GridView наполнился на для индекса 0 и все ОК. При переходе на Page просмотра конкретного элемента и возврате обратно требуется восстановить состояния начальной страницы, а значит идет такая последовательность - сначала SelectionChanged возникает для 0, а потом для индекса восстановленного из сохраненного состояния.

    И вот тут начинается беда с асинхронностью. Наполнение GridView выполняется асинхронно и несмотря на предварительный Clear списка момент где происходит Add выполняется практически одновременно из за чего в GridView я получаю элементы и для индекса 0 и для восстановленного индекса. Clear совал во все щели, ничего не меняется. Потом пытался наполнять коллекцию не через Add, а присвоением, но тогда бывает, что код для индекса 0 отрабатывает чуть позже и хоть и выделен индекс 3 я вижу коллекцию для индекса 0.

    В методе построения списка идет обращения к файлам и там Await а значит без асинхронного выполнения тут не обойтись.

    Код показать не могу, сейчас нет под рукой. Очень надеюсь, что смог описать проблему и вы сможете мне подсказать решение.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    10 апреля 2013 г. 5:59

Ответы

  • Один из вариантов установить для начальной страницы режим кэширования: NavigationCacheMode="Required"

    Тем самым при возврате обратно на страницу со списком событие SelectionChanged с индексом 0 вызываться не будет (оно вообще не будет вызываться, так как все останется не тронутым, т.е. будет выделен старый элемент).

    • Помечено в качестве ответа LXGDARK 10 апреля 2013 г. 13:23
    10 апреля 2013 г. 8:59

Все ответы

  • Один из вариантов установить для начальной страницы режим кэширования: NavigationCacheMode="Required"

    Тем самым при возврате обратно на страницу со списком событие SelectionChanged с индексом 0 вызываться не будет (оно вообще не будет вызываться, так как все останется не тронутым, т.е. будет выделен старый элемент).

    • Помечено в качестве ответа LXGDARK 10 апреля 2013 г. 13:23
    10 апреля 2013 г. 8:59
  • Один из вариантов установить для начальной страницы режим кэширования: NavigationCacheMode="Required"

    Тем самым при возврате обратно на страницу со списком событие SelectionChanged с индексом 0 вызываться не будет (оно вообще не будет вызываться, так как все останется не тронутым, т.е. будет выделен старый элемент).

    Если это  работает так как вы пишите, то просто отлично. Попробую после 17ти (по Москве) и отпишусь.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    10 апреля 2013 г. 9:17