Điều khiển toàn cảnh trong WP8 có lỗi dữ liệu đã biết. Các triệu chứng của lỗi là SelectionChanged không cháy, SelectedIndex & SelectedItem không đáng tin cậy và điều hướng trở lại vào một trang với Panorama đặt lại ảnh toàn cảnh được chọn.
Ví dụ: mẫu mã sau sẽ không bao giờ kích hoạt MessageBox và SelectedIndex & SelectedItem sẽ không cho biết giá trị mong đợi chính xác.
<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; }
}
Một sửa chữa rõ ràng sẽ tự khởi PanoramaItems trong code-behind.
Một giải pháp khác là thay đổi bộ sưu tập của chúng tôi từ được nhập thành chưa được nhập và thêm đoạn mã sau vào lớp dữ liệu bị chặn của chúng tôi. Vì vậy, hãy thay đổi mã của chúng tôi từ ObservableCollection<Cow>
để ObservableCollection<object>
và thêm một số mã để các lớp 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();
}
}
Bây giờ, khi chúng tôi chạy đoạn mã này, chúng ta có thể nhìn thấy đám cháy SelectionChanged như mong đợi với các giá trị SelectedIndex đúng:
![Panorama firing the SelecitonChanged event with the correct SelectedIndex](https://i.stack.imgur.com/GMK4N.png)
Cảm ơn phản hồi của bạn. Bạn làm việc xung quanh hoạt động tốt trên một ứng dụng nhỏ nhưng có thể là một chút đau đớn với một cái gì đó liên quan nhiều hơn. Bất kỳ ý tưởng khi điều này sẽ được cố định? – Brandon
Tôi vừa thử nghiệm và bây giờ sự kiện SelectionChanged dường như hoạt động ngay bây giờ trong WP8. – Sopuli