Элемент управления DataBound Pivot не создает первый PivotItem - PullRequest
13 голосов
/ 06 ноября 2010

На странице 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 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.

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

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

Ответы [ 4 ]

4 голосов
/ 13 ноября 2010

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

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

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

3 голосов
/ 19 ноября 2010

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

Но, установив для элемента управления поворотом 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 ");
        }
    }
1 голос
/ 05 июня 2012

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

pivotTypes.SelectedItem = pivotTypes.Items[ 0 ];
0 голосов
/ 31 мая 2011

Этот пост блога решил мою проблему.

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

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

...