WP8のパノラマコントロールには、既知のデータバインディングのバグがあります。バグの症状は、SelectionChangedが発生しないことです。SelectedIndex & SelectedItemは信頼性が低く、パノラマを使用してページに戻ると、選択したパノラマがリセットされます。
たとえば、次のコードサンプルではMessageBoxとSelectedIndexが発生しません。& SelectedItemは正しい期待値を示しません。
<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; }
}
1つの明らかな修正は、手動でコードビハインドでPanoramaItemsを初期化することになります。
もう1つの解決策は、コレクションを型付きから型なしに変更し、次のコードスニペットをバインドされたデータクラスに追加することです。それでは、ObservableCollection<object>
にObservableCollection<Cow>
から我々のコードを変更し、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();
}
}
、我々は正しいSelectedIndexを値で期待通り、我々は火をSelectionChanged見ることができ、このコードスニペットを実行するとき
感謝。あなたは小規模なアプリでうまく動作しますが、より関わりのあるもので少し痛みが伴うかもしれません。これはいつ修正されるのでしょうか? – Brandon
私はちょうどテストし、今SelectionChangedイベントはWP8で動作するようです。 – Sopuli