Das Panorama-Steuerelement in WP8 hat einen bekannten Datenbindungsfehler. Die Symptome des Fehlers sind, dass SelectionChanged nicht ausgelöst wird, SelectedIndex & SelectedItem sind nicht zuverlässig und die Rücknavigation in eine Seite mit Panorama setzt das ausgewählte Panoramaelement zurück.
Zum Beispiel wird das folgende Codebeispiel die MessageBox nie auslösen und SelectedIndex & SelectedItem wird nicht die richtigen erwarteten Werte angeben.
<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; }
}
Eine offensichtliche Fix wird manuell PanoramaItems in Code-behind zu initialisieren.
Eine andere Lösung wäre, unsere Sammlung von typisiert in untypisiert zu ändern und das folgende Code-Snippet zu unserer begrenzten Datenklasse hinzuzufügen. Also lassen Sie uns unseren Code zu ObservableCollection<object>
von ObservableCollection<Cow>
ändern und einige Code der Cow
Klasse hinzufügen:
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();
}
}
Wenn wir jetzt führen Sie diesen Code-Schnipsel wir Feuer Selection sehen können, wie mit den richtigen SelectedIndex Werte zu erwarten:
Vielen Dank für Ihre Antwort. Sie arbeiten auf einer kleinen App gut, aber vielleicht etwas mit etwas mehr beteiligt. Irgendeine Idee, wenn das behoben wird? – Brandon
Ich habe gerade getestet und jetzt das SelectionChanged-Ereignis scheint jetzt in WP8 zu arbeiten. – Sopuli