Управление DataBound Pivot не создает первый PivotItem

На странице Windows Phone 7 у меня есть следующее управление:

<controls:Pivot x:Name="Pivoter" Title="{Binding Name}" 
      TitleTemplate="{StaticResource PivotTitleTemplate}" 
      HeaderTemplate="{StaticResource PivotHeaderTemplate}"
      ItemsSource="{Binding Items}"
      ItemTemplate="{StaticResource DisplayItemDataTemplate}">
</controls:Pivot >

с этим DataTemplate:

<DataTemplate x:Key="DisplayItemDataTemplate">    
    <Image Grid.Column="0" Stretch="Uniform"
        Source="{Binding LargeImage, Converter={StaticResource UriBitmapConverter}}"/>
    <StackPanel Grid.Column="1" Orientation="Vertical">
        <HyperlinkButton NavigateUri="{Binding Uri}" Content="{Binding Uri}"/>
    </StackPanel>    
</DataTemplate>

ItemsSource - это ObservableCollection. Когда страница отображается, она создает все PivotItems, но первый элемент не создается, если я не прокручиваю вперед и назад. Он имеет запись в списке прокрутки, но не PivotItem.

Если я поставил точку останова в событии Pivot Control LoadingPivotItem, он не вызывается, когда сначала отображается опорная точка, а снова попадает только при прокрутке и возврате к первому элементу.

Кто-нибудь видел подобное поведение для элемента управления Pivot и работает? Или я делаю что-то неправильно?

Ответы

Ответ 1

Я столкнулся с этой проблемой.

Это появляется DataContext для поворота должно быть установлено в конструкторе. Я устанавливал свой DataContext в событие Page_Loaded, и первый опорный элемент не запускал событие "Загрузка", как описано. Просто связав мой DataContext раньше, событие начало стрелять.

Я считаю, что это ошибка в рамках, но я не сделал достаточно, чтобы подтвердить это.

Ответ 2

Я столкнулся с этим, и я не смог решить это, установив контекст данных в конструкторе, поскольку данные, которые собирались отображаться, зависели от информации из NavigationService, поэтому мне пришлось загрузить данные в обработчик page_loaded-event.

Но, установив pivot-controls SelectedIndex на 1 в загруженном страницы, он волшебным образом начал работать. Это не идеальное решение, но в этом случае это был блокиратор, который мне просто нужно было исправить.

Пример кода:

void ChannelOverview_Loaded(object sender, RoutedEventArgs e)
    {
        string channelSystemName;
        if(this.NavigationContext.QueryString.TryGetValue("channelSystemName", out channelSystemName))
        {
            this.viewModel.LoadData(this.Dispatcher, channelSystemName);
            //Set the SelectedIndex to one,
            //otherwise the pivot-view won't render the first item.
            this.overviewPivot.SelectedIndex = 1;
        }
        else 
        {
            MessageBox.Show("Kanalen hade ett felaktigt Id ");
        }
    }

Ответ 3

Может быть, немного поздно, но может кому-то помочь. Как отмечено в документе, SelectedIndex точки поворота, если 0 и изменение контекста данных, приводящее к тому, что SelectedIndex равно 0, не обновляет первый элемент поворота и не вызывает события загрузки элемента поворота. Однако, следуя также работал, когда у меня был связанный с данными поворотный контроль. Обратите внимание, что pivotTypes.Items [0] возвращает объект, привязанный к данным, а не элемент поворота.

pivotTypes.SelectedItem = pivotTypes.Items[ 0 ];

Ответ 4

Этот blogpost решил мою проблему.

Моя проблема с другими предлагаемыми решениями заключалась в том, что я не смог использовать конструктор для установки DataContext, и что время от времени был только один PivotItem, поэтому я мог переключаться назад и вперед, чтобы загрузить контент.

Решение чрезвычайно просто: перед обновлением коллекции, которую Pivot должен установить для своего DataContext равным null. Затем обновите коллекцию и после этого установите DataContext в коллекцию.