2011-02-28 8 views
5

Estoy tratando de usar un control Pivot para una aplicación de tipo calendario, donde cada vista Pivot muestra algunas informaciones sobre el día actual. Cuando el usuario avanza, se muestra el día siguiente. Implementé esto agregando elementos al final de la colección de elementos Pivot, que funciona bien.Endless Pivot Control

Mi problema ocurre cuando el usuario intenta retroceder al día anterior. En este caso, se agrega un nuevo elemento al comienzo de la colección de elementos Pivot. Aunque la adición funciona, el elemento de Pivote mostrado siempre es el incorrecto (es decir, el elemento recién agregado). Establecer SelectedItem en el control Pivot no ayuda.

Creo que Pivot puede no ser el control correcto para mi tarea, por lo que cualquier ayuda acerca de qué vista utilizar o cómo solucionar mi problema antes mencionado con Pivot son muy apreciadas.

código para mi Viewmodel que implementa ir/retroceder un día. Pages está ligado al Pivote ItemSource.

public class TrackDayViewModel : HubViewModelBase 
{ 
    private DateTime _CurrentDay; 
    public DateTime CurrentDay 
    { 
     get { return _CurrentDay; } 
     set 
     { 
      if (value.CompareTo (_CurrentDay) != 0) 
      { 
       _CurrentDay = value; 
       OnPropertyChanged("CurrentDay"); 
      } 
     } 
    } 

    public TrackDayViewModel() 
    { 
     var day = DateTime.Now; 

     CurrentDay = day.Midnight(); 

     Pages.Add(new DayViewModel(CurrentDay.AddDays(-1))); 
     Pages.Add(new DayViewModel(CurrentDay)); 
     Pages.Add(new DayViewModel(CurrentDay.AddDays(1))); 

     SelectedItem = Pages[1]; 

     this.PropertyChanged += (s, e) => 
     { 
      if (e.PropertyName == "SelectedItem") 
      { 
       var si = SelectedItem as DayViewModel; 

       if (si != null) 
       { 
        var idx = Pages.IndexOf(SelectedItem); 
        if (idx==0) 
        { 
         Pages.Insert(0, new DayViewModel(si.Day.AddDays(-1))); 
         SelectedItem = Pages[1]; 
        } 
        else if (idx == (Pages.Count - 1)) 
        { 
         Pages.Add(new DayViewModel(si.Day.AddDays(1))); 
        } 
       } 
      } 
     }; 
    } 
} 

EDIT: Cambio que resolvió mi problema:

 this.PropertyChanged += (s, e) => 
     { 
      if (e.PropertyName == "SelectedItem") 
      { 
       var si = SelectedItem as DayViewModel; 

       if (si != null) 
       { 
        var idx = Pages.IndexOf(SelectedItem); 

        int nextIdx = (idx + 1) % 3; 
        int prevIdx = ((idx - 1)<0) ? 2 : (idx-1); 

        Pages[nextIdx] = new DayViewModel(si.Day.AddDays(1)); 
        Pages[prevIdx] = new DayViewModel(si.Day.AddDays(-1)); 
       } 
      } 
     }; 

Respuesta

5

Por esto, me gustaría utilizar un control de pivote con 4 páginas.

En un momento dado, las páginas anteriores, actuales y próximos contendrá información correcta - y que siempre tendrá una página (vacío)

A continuación, puede responder a los eventos cuando la página actual es cambiante y tiene cambiado - use estos eventos para configurar la página actual (vacía) al contenido nuevo correcto y luego borre la página nueva (vacía).

+1

gracias, su respuesta me indicó la dirección correcta, edité mi pregunta con el código que utilicé – thumbmunkeys

1

Las pautas para el control de pivote indican que debe evitarse si tiene más de 6 páginas.

Utilizándolo para páginas ilimitadas sin problemas.

Lo que recomendaría es usar TransitioningContentControl con la ayuda de gestos táctiles para dar la vuelta hacia adelante y hacia atrás. TransitioningContentControl le permite usar la animación mientras se está cambiando su contenido.

+0

gracias por su respuesta, sé que mi solución es una especie de mal uso de Pivot, pero parece funcionar. – thumbmunkeys