2010-11-06 10 views
13

En una página de Windows Phone 7 Tengo el siguiente control:de control DataBound pivote no está creando la primera PivotItem

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

con este 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> 

El ItemsSource es un ObservableCollection. Cuando se muestra la página, crea todo el PivotItems pero el primer elemento no se crea a menos que avance y regrese a él. Tiene una entrada en la lista de desplazamiento pero no control PivotItem.

Si pongo un punto de interrupción en el evento LoadingPivotItem del Control de Pivote, no se llama cuando el pivote se muestra por primera vez, pero de nuevo solo se golpea cuando me desplazo y regreso al primer elemento.

¿Alguien ha visto un comportamiento similar para el control Pivot y tiene un trabajo? ¿O estoy haciendo algo incorrectamente?

Respuesta

4

Me encontré con este mismo problema.

Parece que el DataContext para el pivote se debe establecer en el constructor. Estaba configurando mi DataContext en el evento Page_Loaded y el primer elemento de pivote no desencadenaría el evento de carga, tal como se describe. Simplemente vinculando mi DataContext antes, el evento comenzó a dispararse.

Creo que es un error en el marco, pero no he hecho lo suficiente para confirmarlo.

3

Me encontré con esto, y no pude resolver esto estableciendo el contexto de datos en el constructor, ya que los datos que se iban a mostrar dependían de la información del NavigationService, así que tuve que cargar los datos en el controlador page_loaded-event.

Pero al establecer los controles de pivote SelectedIndex en 1 en el evento de carga de página, mágicamente comenzó a funcionar. No es una solución ideal, pero en este caso, fue un bloqueador que tuve que arreglar.

Código de ejemplo:

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 "); 
     } 
    } 
+0

he añadido una línea directamente después de la 'this.overviewPivot.SelectedIndex = 1;': 'this.overviewPivot.SelectedIndex = 0;' que trabaja alrededor del insecto también sin verse obligado a codificar el constructor. –

+0

El único problema que tengo ahora es cuando el número de PivotItems es uno porque entonces no podré cambiar a otro PivotItem. No se permite agregar un maniquí cuando se utiliza el enlace para crear los elementos de Pivote. –

+0

Encontré una solución de trabajo, así que agregué una respuesta. –

0

This blogpost resolvió mi problema.

Mi problema con las otras soluciones ofrecidas fue que no pude usar el constructor para establecer el DataContext y que, a veces, solo había un PivotItem para poder ir y venir para cargar el contenido.

La solución es extremadamente simple: antes de actualizar la colección, el Pivot está obligado a establecer su DataContext en nulo. Luego actualice la colección y luego configure el DataContext a la colección.

1

Podría ser un poco tarde, pero podría ayudar a alguien. Tal como se documenta, SelectedIndex del pivote si 0 y un cambio de contexto de datos que da como resultado que SelectedIndex sea 0 nuevamente no actualiza el primer elemento pivote y tampoco llama al evento de carga del elemento pivote. Sin embargo, el seguimiento también funcionó cuando tenía un control de pivote vinculado a datos. Tenga en cuenta que pivotTypes.Items [0] devuelve el objeto vinculado a datos y no el elemento pivote.

pivotTypes.SelectedItem = pivotTypes.Items[ 0 ]; 
Cuestiones relacionadas