Il controllo Panorama in WP8 presenta un bug di associazione dati noto. I sintomi del bug sono che SelectionChanged non si attiva, SelectedIndex & SelectedItem non sono affidabili e che la navigazione di ritorno in una pagina con Panorama reimposta l'elemento selezionato panorama.
Ad esempio, il seguente esempio di codice non attiverà mai MessageBox e SelectedIndex & SelectedItem non indicherà i valori attesi corretti.
<phone:Panorama x:Name="panorama"
ItemsSource="{Binding}"
SelectionChanged="Panorama_SelectionChanged_1">
<phone:Panorama.HeaderTemplate>
<DataTemplate>
<ContentControl Content="{Binding Name}" />
</DataTemplate>
</phone:Panorama.HeaderTemplate>
<phone:Panorama.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding Name}" />
</DataTemplate>
</phone:Panorama.ItemTemplate>
</phone:Panorama>
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new ObservableCollection<Cow>()
{
new Cow("Foo"),
new Cow("Bar"),
new Cow("Baz")
};
}
private void Panorama_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
MessageBox.Show("Panorama_SelectionChanged_1: " + panorama.SelectedIndex);
}
public class Cow
{
public Cow(string name)
{
Name = name;
}
public string Name { get; set; }
}
Una soluzione ovvia sarà di inizializzare manualmente PanoramaItems in code-behind.
Un'altra soluzione sarebbe quella di modificare la nostra raccolta da digitare a non tipizzato e aggiungere il seguente frammento di codice alla nostra classe di dati limitata. Quindi cerchiamo di cambiare il nostro codice da ObservableCollection<Cow>
a ObservableCollection<object>
e aggiungere un po 'di codice alla classe Cow
:
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new ObservableCollection<object>()
{
new Cow("Foo"),
new Cow("Bar"),
new Cow("Baz")
};
}
public class Cow
{
public Cow(string name)
{
Name = name;
}
public string Name { get; set; }
public override bool Equals(object obj)
{
if ((obj != null) && (obj.GetType() == typeof(PanoramaItem)))
{
var thePanoItem = (PanoramaItem)obj;
return base.Equals(thePanoItem.Header);
}
else
{
return base.Equals(obj);
}
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
Ora, quando si corre questo frammento di codice possiamo vedere SelectionChanged incendi come previsto con i valori SelectedIndex corretti:
Grazie per la risposta. Il work-around funziona alla grande su una piccola app ma potrebbe essere un po 'un problema con qualcosa di più coinvolto. Qualche idea su quando sarà risolto? – Brandon
Ho appena testato e ora l'evento SelectionChanged sembra funzionare ora in WP8. – Sopuli