在IsolatedStorage中保存并获取ObservableCollection时出错

时间:2012-09-25 04:08:28

标签: c# windows-phone-7 isolatedstorage

我一直在使用一个帮助器类,它使用键值对从孤立存储中保存和检索值。这适用于我的应用程序中更改的单个值,但我现在尝试将其用于ObservableCollection,其中将在运行时添加和删除项目。出于某种原因,当关闭并重​​新打开应用程序时,不会从IsolatedStorage存储和/或检索我的ObservableCollection。我不确定我做错了什么,因为这对个人价值观有效吗?

Setting.cs

public class Setting<T>
{
    string name;
    T value;
    T defaultValue;
    bool hasValue;

    public Setting(string name, T defaultValue)
    {
        this.name = name;
        this.defaultValue = defaultValue;
    }

    public T Value
    {
        get
        {
            //Check for the cached value
            if (!this.hasValue)
            {
                //Try to get the value from Isolated Storage
                if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue(this.name, out this.value))
                {
                    //It hasn't been set yet
                    this.value = this.defaultValue;
                    IsolatedStorageSettings.ApplicationSettings[this.name] = this.value;
                }
                this.hasValue = true;
            }
            return this.value;
        }

        set
        {
            //Save the value to Isolated Storage
            IsolatedStorageSettings.ApplicationSettings[this.name] = value;
            this.value = value;
            this.hasValue = true;
        }
    }

    public T DefaultValue
    {
        get { return this.defaultValue; }
    }

    // Clear cached value
    public void ForceRefresh()
    {
        this.hasValue = false;
    }
}

上面的Setting.cs类用于存储和检索值,我使用另一个名为Settings.cs的类作为使用这些存储值的机制。

Settings.cs

public static Setting<ObservableCollection<BrowserItem>> BrowserList = new Setting<ObservableCollection<BrowserItem>>("Browsers", new ObservableCollection<BrowserItem>());
    public static Setting<string> InitialUri = new Setting<string>("InitialUri", "http://www.bing.com");

在上文中,可以更改InitialUri并正确保存和检索值。另一方面,BrowserList(BrowserItem类型的ObservableCollection(自定义类))是否未存储或保存?以下显示了我尝试使用BrowserList

的方式

BrowserItem.cs

[DataContract]
public class BrowserItem

{
    [DataMember]
    public FullWebBrowser Browser
    {
        get;
        set;
    }
    [DataMember]
    public string Url
    {
        get;
        set;
    }
    [DataMember]
    public BitmapImage ImageUri
    {
        get;
        set;
    }
    [DataMember]
    public string Title
    {
        get;
        set;
    }
    [DataMember]
    public string Notification
    {
        get;
        set;
    }
    [DataMember]
    public bool DisplayNotification
    {
        get
        {
            return !string.IsNullOrEmpty(this.Notification);
        }
    }
    [DataMember]
    public string Message
    {
        get;
        set;
    }
    [DataMember]
    public string GroupTag
    {
        get;
        set;
    }
    [DataMember]
    //for translation purposes (bound to HubTile Title on MainPage) 
    public string TileName
    {
        get;
        set;
    }
}

TabsPage.xaml.cs

void addNew_Click(object sender, EventArgs e)
    {
        BitmapImage newTileImage = new BitmapImage();

        var newItem = new BrowserItem() { Browser = new FullWebBrowser(), Url = "http://www.bing.com", ImageUri = newTileImage, Title = "new", /*Notification = "",*/ Message = "new browser", GroupTag = "TileGroup", TileName = "new" };
        newItem.Browser.InitialUri = Settings.InitialUri.Value; //set the initial uri when created
        Settings.BrowserList.Value.Add(newItem); //update saved BrowserList
    }

addNew_Click偶数处理程序中,成功添加了名为BrowserItem的新newItem。但是当应用程序关闭或重新打开时,我会检查BrowserList以查看是否存在项目,如果有,我想根据ObservableCollection中的项目索引值加载特定项目。每次我执行检查时,BrowserList都没有保存的项目?如何在集合中正确保存这些值以便它们能够持久存在?

1 个答案:

答案 0 :(得分:0)

这可能是由于可观察集合中包含的类型的序列化失败。 首先,您的BrowserItem类型需要通过实现序列化接口的继承或应用[Serializable]属性来标记为可序列化:

[Serializable]
public class BrowserItem
{

}

事实上,如果BrowserItem(或您尝试保存到设置的任何其他类型)是可序列化的,那么this Q/A可以为您提供帮助。

同样,如果您的类型已经可序列化,您可能希望将集合的样本序列化为xml文件中的磁盘,这样您就可以手动/可视地检查类型可能导致问题的原因(如果有的话)序列化/反序列化