序列化用作Jumplist ItemSsource的ObservableCollection

时间:2014-04-11 11:47:13

标签: c# xml serialization observablecollection longlistselector

我正在尝试为LongListSelector创建跳转列表,我使用MS的AlphaKeyGroup示例作为基础。

创建列表后,我想将其序列化并存储,直到下次打开应用程序为止。

我遇到的问题是,当我反序列化ObservableCollection时,Key为null。

我的主页上有这样的东西

    public ObservableCollection<AlphaKeyGroup<myClass>> myList { get; set; }
    void process()
    {
        myList = AlphaKeyGroup<myClass>.CreateGroups(System.Threading.Thread.CurrentThread.CurrentUICulture);
        getItemsAndAddtoList();

        string serializedata = Serialize(myList);
    }
    void getItemsAndAddtoList()
    {
        List<myClass> templist=new List<myClass>();

        templist.Add(new myClass("Alpha","A in the jumplist"));
        templist.Add(new myClass("Beta", "B in the jumplist"));
        templist.Add(new myClass("Cappa", "C in the Jumplist"));

        addToList(templist.ToArray());

        string data = Serialize(myList);

    }
    void addToList(myClass[] items)
    {
        if (this.mainList.Dispatcher.CheckAccess())
        {
            SortedLocaleGrouping slg = new SortedLocaleGrouping(System.Threading.Thread.CurrentThread.CurrentUICulture);

            foreach (myClass item in items)
            {
                int index = 0;

                if (slg.SupportsPhonetics)
                {

                }
                else
                {
                    index = slg.GetGroupIndex(item.description);
                }
                if (index >= 0 && index < myList.Count)
                {
                    myList[index].Add(item);
                }
            }
        }

        else
        {

            this.mainList.Dispatcher.BeginInvoke(new Action<myClass[]>(addToList), new object[] { items });
        }
    }
    public static string Serialize(object obj)
    {
        using (var sw = new StringWriter())
        {
            var serializer = new XmlSerializer(obj.GetType());
            serializer.Serialize(sw, obj);
            return sw.ToString();
        }
    }

如果我打破return sw.ToString();,我可以看到类似这样的内容

<ArrayOfMyClass>
  <myClass>
   <description>Alpha</description>
   <data>A in the jumplist</data>
  </myClass>
</ArrayOfMyClass>

正如您所看到的,AlphaKeyGroup类中的键缺失,如果我将其反序列化并将其设置为LongListSelector ItemSource,则会得到一个没有文本值的Jumplist,只有空框。​​

public class myClass
{
    public string description { get; set; }
    public string data { get; set; }
    public myClass()
    {

    }
    public myClass(string Desc, string Data)
    {
        description = Desc;
        data = Data;
    }
}
public class AlphaKeyGroup<T> : ObservableCollection<T>
{
    public delegate string GetKeyDelegate(T item);

    public string Key { get; set; }

    public AlphaKeyGroup(string key)
    {
        Key = key;
    }
    public AlphaKeyGroup()
    {

    }

    public static ObservableCollection<AlphaKeyGroup<T>> CreateGroups(CultureInfo ci)
    {
        SortedLocaleGrouping slg = new SortedLocaleGrouping(ci);

        ObservableCollection<AlphaKeyGroup<T>> list = new ObservableCollection<AlphaKeyGroup<T>>();

        foreach (string key in slg.GroupDisplayNames)
        {
            list.Add(new AlphaKeyGroup<T>(key));
        }

        return list;

    }

}

我确信我错过了一些简单的东西,但是我找不到解决方案,我认为这是与Parameterless构造函数有关,但我不确定,我对C#很新。

0 个答案:

没有答案