2

我是 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();
  }
}

ProfileStorage 始终为 Null。

所以这是我的问题。经过一番搜索,我发现 Stackowerflow 上的一篇文章中描述了以下 hack。我需要手动更改settings.Designer.cs:

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

这样设置“配置文件”可以正确保存和恢复。

但我不喜欢这个解决方案原因:

  1. 这是一个黑客
  2. 每次添加/删除设置时,settings.designer.cs 都会更改
  3. 好吧,再次,这是一个黑客!

所以我想问题出在序列化的某个地方。但是 ObservableCollection 可以完美地序列化,正如我们在示例中看到的那样。

PS我也尝试System.Collections.ObjectModel.ObservableCollection<tick_time.UserProfile>在设置设计器中浏览(tick_time 是我的项目名称空间的名称),但我没有任何运气。

所以,我将不胜感激任何建议!

4

1 回答 1

1

经过更多搜索后,我能够想出更少的黑客解决方案。我使用了来自http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/6f0a2b13-88a9-4fd8-b0fe-874944321e4a/的想法(见最后一条评论)。

这个想法不是修改settings.Designer.cs,而是专门创建的另一个文件。自动生成Settings是部分的,所以我们可以在其他文件中完成它的定义。所以我只是制作了专门的文件来包含手动添加的属性!

它确实奏效了。

所以现在我会把它当作一个答案。

于 2013-01-24T20:48:22.413 回答