使用自定义类将列表或数组保存到应用程序设置

时间:2011-11-25 01:25:40

标签: c# silverlight windows-phone-7 application-settings

我目前正在使用admam nathan的书籍101 Windows Phone Apps中的应用程序设置类:

    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
        {
            //checked for cached value
            if (!this.hasValue)
            {
                //try to get value from isolated storage
                if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue(this.name, out this.value))
                {
                    //not set yet
                    this.value = this.defaultValue;
                    IsolatedStorageSettings.ApplicationSettings[this.name] = this.value;
                }

                this.hasValue = true;
            }

            return this.value;
        }

        set
        {
            //save 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;
    }
}

然后在一个单独的课程中:

公共静态类设置     {         //设置菜单中的用户设置

    public static readonly Setting<bool> IsAerialMapStyle = new Setting<bool>("IsAerialMapStyle", false);

}

一切正常但我无法解决如何使用此方法将数组或长度为24的列表保存到应用程序设置。

到目前为止,我有这个:

  public static readonly Setting<List<bool>> ListOpened = new Setting<List<bool>>("ListOpened",....

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

Using Data Contracts。 您需要通过类定义上的[DataContract]属性和每个字段(要保留的)上的[DataMember]将您的Setting类型声明为可序列化。哦,你需要System.Runtime.Serialization。

如果您不想公开私有字段值(值被序列化为XML并且可能被不恰当地暴露),您可以修饰属性声明,例如:

using System.Runtime.Serialization;
. . .
[DataContract]
public class Settings {
    string Name;
    . . .
    [DataMember]
    public T Value {
    . . .
    }

如果您的类没有更新所有实例数据的属性,您可能还必须装饰这些私有字段。没有必要装饰公共财产和相应的私人领域。

哦,你包装这个类的所有类型T也必须是可序列化的。原始类型是,但用户定义的类(可能还有一些CLR类型?)不会。

答案 1 :(得分:0)

不幸的是,AFAIK,您无法将其作为单个ApplicationSettings字典条目存储在key value中。您只能存储内置数据类型(int,long,bool,string ..)。要保存这样的列表,您必须将对象序列化到内存中,或者使用SQLCE数据库来存储值(Mango)。