2012-05-04 13 views
5

Vorrei utilizzare un FlipView per visualizzare alcuni elementi e iniziare a mostrare un articolo specifico.Perché FlipView ignora SelectedItem

Per questo, ho definito una classe vista del modello:

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; } 
} 

Come si può vedere, l'elemento selezionato è non la prima voce.

Ora per la XAML:

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

Tuttavia, quando si esegue l'applicazione, la vista della medaglia mostra il primo elemento, non la seconda voce.

È intenzionale? O è un errore?

+0

Ignora anche SelectedIndex. Non riesco a impostare la selezione su FlipView in alcun modo su WinRT. Hai risolto questo problema in qualche modo? – hendrix

risposta

10

Prova questa

<FlipView 
    ItemsSource="{Binding Items}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" /> 
  • tua SelectedItem deve essere vincolante un TwoWay per farlo funzionare, dal momento che il valore è impostato sia il controllo e il modello di vista.
+0

risolto il mio problema. Grazie! –

1

In aggiunta a quanto dichiarato da Filip, la classe (MyDataContext) deve notificare all'interfaccia utente che la proprietà è stata modificata. Il tuo ViewModel deve implementare INotifyPropertyChanged e la proprietà ha bisogno di generare l'evento PropertyChanged

public class ViewModel : INotifyPropertyChanged 
{ 
    private object _selectedItem; 

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

È inoltre possibile utilizzare la classe BindableBase che viene fornito con le applicazioni di esempio

public class ViewModel : BindableBase 
{ 
    private object _selectedItem; 

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

stava avendo lo stesso problema con il FlipView e impossibile riuscire a far funzionare l'opzione BindableBase o TwoWay. Poiché l'ordine della lista non era un argomento per me, ho creato un metodo per riordinare ItemsSource, per iniziare con SelectedItem come il primo elemento della Collection.

Nel codice sottostante, il risultato è il nuovo ItemsSource per il FlipView, anziché i precedenti elementi dell'elenco.

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, attualmente sto usando questa soluzione alternativa, ma è solo una soluzione temporanea. – hendrix

0

Sembra un bug. Se esegui il debug del tuo codice, noterai che inizialmente il tuo SelectedItem nella VM è impostato sull'elemento giusto, quindi viene impostato su null e successivamente viene impostato sul primo elemento della raccolta ItemsSource di FlipView.

Come soluzione temporanea, vedo l'impostazione SelectedItem della VM dopo l'evento Loaded di FlipView.

Problemi correlati