2012-05-04 16 views
5

Me gustaría usar una FlipView para mostrar algunos elementos y comenzar a mostrar un elemento específico.¿Por qué FlipView ignora SelectedItem

Para esto, he definido una clase de vista del modelo:

class MyDataContext 
{ 

    public MyDataContext() 
    { 
     Items = new List<MyClass>(); 
     Items.Add(new MyClass("1")); 
     Items.Add(new MyClass("2")); 
     Items.Add(new MyClass("3")); 
     SelectedItem = Items[1]; 
    } 

    public List<MyClass> Items { get; set; } 
    public MyClass SelectedItem { get; set; } 
} 

Como se puede ver, el elemento seleccionado es no el primer elemento.

Ahora para el XAML:

<FlipView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}"></FlipView> 

Sin embargo, cuando ejecuto la aplicación, la vista flip muestra el primer elemento, no el segundo elemento.

¿Esto es intencional ?, ¿o es un error?

+0

También ignora SelectedIndex. No puedo establecer la selección en FlipView de ninguna manera en WinRT. ¿Has resuelto este problema de alguna manera? – hendrix

Respuesta

10

probar este

<FlipView 
    ItemsSource="{Binding Items}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" /> 
  • su SelectedItem tiene que ser un TwoWay vinculante para que funcione, ya que el valor se establece por tanto el control y el modelo de vista.
+0

resolvió mi problema. ¡Gracias! –

1

Además de lo que declaró Filip, su clase (MyDataContext) necesita notificar a la IU que la propiedad ha cambiado. Su modelo de vista debe implementar INotifyPropertyChanged y la propiedad debe desencadenar el evento PropertyChanged

public class ViewModel : INotifyPropertyChanged 
{ 
    private object _selectedItem; 

    public object SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 
} 

También puede utilizar la clase BindableBase que viene con las aplicaciones de muestra

public class ViewModel : BindableBase 
{ 
    private object _selectedItem; 

    public object SelectedItem 
    { 
     get { return this._selectedItem; } 
     set { this.SetProperty(ref this._selectedItem, value); } 
    } 
} 
5

estaba teniendo el mismo problema con el FlipView y no se puede obtener la opción BindableBase o TwoWay para que funcione. Debido a que el orden de la lista no era realmente un tema para mí, he creado un método para reordenar ItemsSource, para comenzar con SelectedItem como el primer elemento de la Colección.

En el código subyacente, el resultado es el nuevo ItemsSource para FlipView, en lugar de los elementos List anteriores.

public static List<T> ReorderList(List<T> elements, T selectedElement) 
    { 
     var elementIndex = elements.FindIndex(x => x.Id == selectedElement.Id); 
     var result = new List<T>(); 

     foreach (var item in elements) 
     { 
      if (elementIndex .Equals(elements.Count)) 
      { 
       elementIndex = 0; 
      } 

      result.Add(elements[elementIndex]); 

      elementIndex++; 
     } 

     return result; 
    } 
+0

+1, Actualmente estoy usando esta solución alternativa, pero solo es una solución temporal. – hendrix

0

Parece un error. Si depura su código, notará que al principio su SelectedItem en VM se establece en el elemento correcto, luego se establece en null y luego se establece en el primer elemento de la colección ItemsSource de FlipView.

Como solución alternativa, veo la configuración de SelectedItem de VM después de que se genera el evento Loaded de FlipView.

Cuestiones relacionadas