如何保存对Properties.Settings中存储的ObservableCollection的更改

时间:2017-02-10 22:07:05

标签: c# wpf

使用简单的世界时钟程序让我遇到了如何在程序运行之间保留自定义 'public/css/vendor/font-awesome.min.css', Bundle('public/css/app.styl', - depends='/**/*.styl', filters='stylus', output='public/css/app.css'), filters='cssmin', -对象的问题。我可以成功保存其他设置类型,如字符串,双打和布尔值,但ObservableCollection不会在程序会话之间保存。

不会抛出任何错误,调试器值似乎正在更新(Clock计数增加),并且时钟会被添加到显示的列表中而没有任何问题。

这个question让我了解下面的代码结构。

enter image description here

Settings.Designer.cs - 手动创建

ObservableCollection

时钟类定义

Properties.Settings.Default.SavedClocks

主窗口已初始化

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public ObservableCollection<Clock> SavedClocks
{
    get{
        return ((ObservableCollection<Clock>)(this["SavedClocks"]));
    }
    set{
        this["SavedClocks"] = value;
    }
}

向可观察集合添加新时钟(从下拉列表中)

[Serializable]
public class Clock : INotifyPropertyChanged
{
    public string m_LocationName { get; set; }
    public TimeZoneInfo m_TimeZone { get; set; }

    public Clock(){}

    public Clock(TimeZoneInfo tz, string name)
    {
        m_TimeZone = tz;
        m_LocationName = name;
    }

    //.... Other methods removed for brevity
}

XAML - 不要认为其中任何一个都有用,但这里是ListView我设置

的ItemSource
namespace WorldClock
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            if (Properties.Settings.Default.SavedClocks == null)
            {
                Properties.Settings.Default.SavedClocks = new ObservableCollection<Clock>
                {
                    //When list is empty, default with local clock
                    new Clock(System.TimeZoneInfo.Local, System.TimeZoneInfo.Local.StandardName)
                };

                Properties.Settings.Default.Save();
            }

            lvDataBinding.ItemsSource = Properties.Settings.Default.SavedClocks;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

尝试将SettingsSerializeAs属性添加到Settings.Designer.cs的SavedClocks属性中,以指定该集合应序列化为二进制数据:

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Binary)]
[global::System.Configuration.DefaultSettingValueAttribute(null)]
public ObservableCollection<Clock> SavedClocks
{
    get
    {
        return ((ObservableCollection<Clock>)(this["SavedClocks"]));
    }
    set
    {
        this["SavedClocks"] = value;
    }
}