我正在尝试在“应用程序设置”中存储自定义对象的集合。
在this related question的帮助下,这就是我目前所拥有的:
// implementing ApplicationSettingsBase so this shows up in the Settings designer's
// browse function
public class PeopleHolder : ApplicationSettingsBase
{
[UserScopedSetting()]
[SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Xml)]
public ObservableCollection<Person> People { get; set; }
}
[Serializable]
public class Person
{
public String FirstName { get; set; }
}
public MainWindow()
{
InitializeComponent();
// AllPeople is always null, not persisting
if (Properties.Settings.Default.AllPeople == null)
{
Properties.Settings.Default.AllPeople = new PeopleHolder()
{
People = new ObservableCollection<Person>
{
new Person() { FirstName = "bob" },
new Person() { FirstName = "sue" },
new Person() { FirstName = "bill" }
}
};
Properties.Settings.Default.Save();
}
else
{
MessageBox.Show(Properties.Settings.Default.AllPeople.People.Count.ToString());
}
}
在Settings.Settings Designer中,我通过浏览器按钮添加了PeopleHolder类型的属性,并将范围设置为“User”。 Save()方法似乎成功完成,没有错误消息,但每次重新启动应用程序设置时都不会保留。
虽然上面的代码中没有显示,但我能够坚持使用Strings,而不是我的自定义集合(我在其他类似的问题中注意到,有时版本号会出现问题,这会阻止在调试时保存设置,所以我我想排除那可能的罪魁祸首。)
有什么想法吗?我确信有一种非常简单的方法可以做到这一点,我只是缺少:)。
感谢您的帮助!
答案 0 :(得分:10)
我想通过this question来解决这个问题!
正如该问题所示,我将其添加到了Settings.Designer.cs:
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public ObservableCollection<Person> AllPeople
{
get
{
return ((ObservableCollection<Person>)(this["AllPeople"]));
}
set
{
this["AllPeople"] = value;
}
}
然后我需要的是以下代码:
[Serializable]
public class Person
{
public String FirstName { get; set; }
}
public MainWindow()
{
InitializeComponent();
// this now works!!
if (Properties.Settings.Default.AllPeople == null)
{
Properties.Settings.Default.AllPeople = new ObservableCollection<Person>
{
new Person() { FirstName = "bob" },
new Person() { FirstName = "sue" },
new Person() { FirstName = "bill" }
};
Properties.Settings.Default.Save();
}
else
{
MessageBox.Show(Properties.Settings.Default.AllPeople.People.Count.ToString());
}
}
答案 1 :(得分:3)
如果将ObservableCollection<People>
添加到您自己的代码中,但指定了“属性”命名空间,则可以在不更改settings.Designer.cs的情况下进行此更改:
namespace MyApplication.Properties
{
public sealed partial class Settings
{
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public ObservableCollection<Person> AllPeople
{
get
{
return ((ObservableCollection<Person>)(this["AllPeople"]));
}
set
{
this["AllPeople"] = value;
}
}
}
}
请注意,我将Settings
课程的辅助功能更改为 public
。 (我可能不需要这样做)。
我在整个解决方案/答案中看到的唯一缺点是您无法再使用项目更改应用程序配置设置 - &gt;属性对话框。这样做会严重通过将设置转换为字符串并修改XML标记来搞乱新设置。
因为我想使用单个系统范围的配置文件而不是用户特定的文件,所以我还将global::System.Configuration.UserScopedSettingAttribute()]
更改为[global::System.Configuration.ApplicationScopedSetting()]
。我在课堂上留下了set
个来访者,但我知道它实际上没有保存。
谢谢你的回答!它使我的代码更清晰,更易于管理。