Обновление ObservableCollection, связанной с падениями Pivot, для SelectedIndex> = 2 (wp7) - PullRequest
3 голосов
/ 20 декабря 2010

У меня есть observableCollection, привязанная к элементу управления pivot в моем пользовательском интерфейсе. Когда я пытаюсь обновить коллекцию (clear () items и создать заново), все работает нормально, если selectedIndex элемента управления pivot больше или равен 2.

В этом случае я получаю исключение ArgumentOutOfRange, когда пытаюсь вызвать Add () для наблюдаемой коллекции. Это очень странно.

Я попытался создать новую наблюдаемую коллекцию, а затем добавить элементы Add (), похоже, это работает, но я не обновляю пользовательский интерфейс, пока не вызову функцию обновления дважды.

Что может быть не так? Это ошибка?

Ответы [ 5 ]

1 голос
/ 13 февраля 2011

Вы, наверное, уже решили это, но вот что я сделал.Как упоминалось ранее, это известная «ошибка» / ограничение.Однако вы можете установить SelectedIndex в событии Loaded для страницы.

См. Здесь: http://christian -helle.blogspot.com / 2011/02 / working-around-pivot-selectedindex.html

Это помогло мне, и теперь работает нормально =)

1 голос
/ 28 декабря 2010

Это известная проблема.

Необработанное исключение при установке для свойства SelectedItem / SelectedIndex элемента управления Pivot третьего элемента сводки (WP7)

Не откладывать навигацию / (привязка?) к загруженному событию есть обходной путь.

0 голосов
/ 15 февраля 2011

Я собираюсь попробовать исправление, предложенное @Jimmy Engtröm. Однако я также смог обойти эту проблему, подождав, пока не произойдет загрузка.

<controls:Pivot x:Name="pivotCtrl" Title="{Binding ApplicationTitle}" 
Loaded="OnPivotControlLoaded" Opacity="1">

И в коде страницы позади:

private void OnPivotControlLoaded(object sender, RoutedEventArgs e)
{
    // Restore the Pivot control's SelectedIndex
    if (State.ContainsKey(SelectedPivotIndexKey))
    {
        pivotCtrl.SelectedIndex = State.Get<int>(SelectedPivotIndexKey);
    }

    myStoryboard.Begin();
}

Теперь, почему раскадровка? Что ж, когда вы подождете до Load, вы увидите первый пивот, и он хромает. Таким образом, раскадровка делает быстрое появление ... достаточно, чтобы замаскировать исправление. Я попытался просто установить видимость, но это может привести к сбою приложения. Также обратите внимание, что в целях дизайна я оставляю Opacity равным 1 в XAML сводного элемента управления. Вот раскадровка:

<Storyboard x:Name="myStoryboard">
    <DoubleAnimation
        Storyboard.TargetName="pivotCtrl"
        Storyboard.TargetProperty="Opacity"
        From="0.0" To="1.0" Duration="0:0:01"
        />
</Storyboard>

Вот вспомогательные функции (помещенные в отдельный файл класса и на которые есть ссылки, например, используя MyApp.Helpers, а файл класса должен ссылаться на System.Collections.Generic)

public static T Get<T>(this IDictionary<string, object> dictionary, string key)
{
    return (T)dictionary[key];
}

public static void AddOrReplace<T>(this IDictionary<string, T> dictionary, string key, T item)
{
    if (dictionary.ContainsKey(key))
        dictionary.Remove(key);

    dictionary.Add(key, item);
}

Опять же, это не самое лучшее исправление, но оно работает хорошо, и появление на самом деле - это то, что я мог бы использовать в другом месте.

0 голосов
/ 21 декабря 2010

Как уже упоминалось. Элемент управления Pivot оптимизирован, чтобы не загружать все панели. Если вы пробуете то, что, как мне кажется, вы пытаетесь, я бы посоветовал вам переключиться на Panorama Control, который инициализирует все PanoramaItems.

0 голосов
/ 20 декабря 2010

Чтобы попытаться сохранить нагрузку и производительность, накладные расходы загружают только отображаемый в данный момент круг и те, которые находятся по обе стороны.Другие элементы загружаются с задержкой, когда отображается соседний элемент.Как следствие этого вы можете столкнуться с проблемами при попытке установить SelectedItem для элемента, который не был загружен или страница не загрузилась полностью.

Если вы можете поделиться кодом, чтобы продемонстрировать, что выВозможно, мы сможем оказать более конкретную помощь.

...