无法保存自定义集合用户设置
本文关键字:用户 设置 集合 自定义 保存 | 更新日期: 2023-09-27 17:55:57
我是C#和.Net的新手,来自C++的世界。我正在通过为自己创建一个小应用程序来学习 C# WPF。
目前我需要创建一个集合用户设置。因为之后我希望能够将此集合绑定到列表框,因此我决定使用 ObservableCollection。
到目前为止,经过长时间的搜索,这就是我所拥有的:
public class ProfileStorage : ApplicationSettingsBase
{
public ProfileStorage()
{
this.UserProfiles = new ObservableCollection<UserProfile>();
}
[UserScopedSetting()]
[SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Binary)]
[DefaultSettingValue("")]
public ObservableCollection<UserProfile> UserProfiles
{
get
{
return (ObservableCollection<UserProfile>)this["UserProfiles"];
}
set
{
this["UserProfiles"] = value;
}
}
}
[Serializable]
public class UserProfile
{
public String Name { get; set; }
}
我什至能够在设置设计器中浏览它并创建一个名为"ProfileStorage"的设置。以下是在settings.designer.cs中自动创建的代码:
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::tick_time.ProfileStorage ProfileStorage {
get {
return ((global::tick_time.ProfileStorage)(this["ProfileStorage"]));
}
set {
this["ProfileStorage"] = value;
}
}
问题是我无法保存此设置!我使用以下代码来检查这一点。
if (null == Properties.Settings.Default.ProfileStorage)
{
Properties.Settings.Default.ProfileStorage = new ProfileStorage()
{
UserProfiles = new ObservableCollection<UserProfile>
{
new UserProfile{Name = "1"},
new UserProfile{Name = "2"}
}
};
Properties.Settings.Default.Save();
}
}
配置文件存储始终为空。
所以这是我的问题。经过一些搜索,我发现了以下黑客在Stackowerflow上的一篇文章中描述的。我需要手动更改设置。设计师.cs:
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public ObservableCollection<UserProfile> Profiles
{
get
{
return ((ObservableCollection<UserProfile>)(this["Profiles"]));
}
set
{
this["Profiles"] = value;
}
}
这样设置"配置文件"可以正确保存和恢复。
但我不喜欢这个解决方案,因为:
- 这是一个黑客
- 设置设计器.cs每次添加/删除设置时都会更改
- 好吧,再说一遍,这是一个黑客!
所以我想问题出在序列化的某个地方。但是 ObservableCollection 可以完美地序列化,正如我们在示例中所看到的。
附言我还尝试在设置设计器中浏览System.Collections.ObjectModel.ObservableCollection<tick_time.UserProfile>
(tick_time是我的项目命名空间的名称),但我没有任何运气。
所以,我将不胜感激任何建议!
经过更多的搜索,我能够想出更少的黑客解决方案。我使用了 http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/6f0a2b13-88a9-4fd8-b0fe-874944321e4a/的想法(见最后一条评论)。
这个想法是修改而不是设置。设计器.cs,但专门创建了另一个文件。自动生成的Settings
是部分的,因此我们可以在其他文件中完成它的定义。所以我只是制作了专用文件来包含手动添加的属性!
它确实奏效了。
所以现在我把它当作一个答案。