Windows Phone

Windows Phone - Panorama搭配Binding无法补捉SelectionChanged事件


这篇文章真是个笔记阿,因为实践Panorama时我第一次遇到它搭配Binding之后,竟然无法补捉SelectionChanged事件。

根据相关的网络文献指出:

a. 这是Windows Phone 8 Panorama已知databinding的bug;

b. 需要将原有的DataSource重新利用new ObservableCollection()来重建;

c. 既有的Model需要增加override Equals的方法做为转换的识别值;

搭配一个简单的例子说明:

今天实践了一个Model:image,需要借由Panorama来显示每张图片,并标示目前有几页,例如:2/4的效果。

根据的介绍,便来实践三个重点事件:

1. 先增加Model去override Equals的关键事件,如下:

public class image : INotifyPropertyChanged
{
    public string imageId { get; set; }
 
    private string gurl = string.Empty;
 
    public string url
    {
        get { return gurl; }
        set { gurl = value; }
    }
 
    public string imageDesc { get; set; }
 
    public event PropertyChangedEventHandler PropertyChanged;
 
    protected virtual void OnPropertyChanged([CallerMemberName] string pPropertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(pPropertyName));
        }
    }
 
    #region 实践当PanoramaItem搭配Data Binding时无法触发SelectionChanged的事件
    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();
    }
    #endregion
}


    主要增加如下重点部分,为了就是在对象识别时可以知道目前被Binding上去的对象是否为PanoramaItem并加以识别:

#region 实践当PanoramaItem搭配Data Binding时无法触发SelectionChanged的事件
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();
}
#endregion


2. 重新为DataBinding的DataContext给予new ObservableCollection()的建立方式,如下:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    //重新建立DataContext的对象结构,改由object取得原有的image
    var tNewSources = new ObservableCollection();

    foreach (image tImg in ((imageSet)this.DataContext).ImgSources)
    {
        tNewSources.Add(tImg);
    }
    //重新给值
    pn1.ItemsSource = tNewSources;
}


只要做二件事即能让Panorama搭配DataBinding后正常触发SelectionChanged的事件。真的非常奇妙。

======

我只能说这个问题真是个奇皅了。除非您真的写到Panorama与Data Binding同时使用,不然真的不会注意到这个问题。

做个记录,希望对大家有所帮助。谢谢。

References:

‧Windows Phone 8 Panorama SelectionChanged & Databinding

‧SelectionChanged Event for ListBox in panorama.ItemTemplate for Windows Phone?

‧WP8 Panorama with binding SelectionChanged doesnt fired. Bug?

‧[语法问题] panorama.ItemTemplate的SelectionChanged事件

‧Windows Phone 8全景的SelectionChanged和数据绑定

Dotblogs 的标签:Windows Phone