Problème lors de l’enregistrement d’une collection d’objects dans les parameters de l’application

J’essaie de stocker une collection d’objects personnalisés dans les parameters de l’application.

Avec l’aide de cette question connexe , voici ce que j’ai actuellement:

// 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 People { get; set; } } [Serializable] public class Person { public Ssortingng 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 { 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.ToSsortingng()); } } 

Dans le Settings.Settings Designer, j’ai ajouté une propriété de type PeopleHolder via le bouton du navigateur et défini la scope sur “Utilisateur”. La méthode Save () semble se terminer avec succès. Il n’y a pas de message d’erreur, mais à chaque redémarrage, les parameters de l’application ne sont pas conservés.

Bien que cela ne soit pas indiqué dans le code ci-dessus, je suis capable de conserver des chaînes, mais pas ma collection personnalisée (j’ai remarqué que dans d’autres questions similaires sur SO, il peut parfois y avoir un problème avec les numéros de version qui empêche la sauvegarde des parameters lors du débogage. en tant que coupable possible.)

Des idées? Je suis sûr qu’il existe un moyen très simple de faire cela qui me manque :).

Merci de votre aide!

Je l’ai compris grâce à cette question !

Comme suggéré dans cette question, j’ai ajouté ceci à Settings.Designer.cs:

  [global::System.Configuration.UserScopedSettingAtsortingbute()] [global::System.Diagnostics.DebuggerNonUserCodeAtsortingbute()] public ObservableCollection AllPeople { get { return ((ObservableCollection)(this["AllPeople"])); } set { this["AllPeople"] = value; } } 

Et puis tout ce dont j’avais besoin était le code suivant:

 [Serializable] public class Person { public Ssortingng FirstName { get; set; } } public MainWindow() { InitializeComponent(); // this now works!! if (Properties.Settings.Default.AllPeople == null) { Properties.Settings.Default.AllPeople = new ObservableCollection { 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.ToSsortingng()); } } 

Si vous ajoutez ObservableCollection à votre propre code, mais spécifiez l’espace de noms “Propriétés”, vous pouvez effectuer cette modification sans modifier le paramètre settings.Designer.cs:

 namespace MyApplication.Properties { public sealed partial class Settings { [global::System.Configuration.UserScopedSettingAtsortingbute()] [global::System.Diagnostics.DebuggerNonUserCodeAtsortingbute()] public ObservableCollection AllPeople { get { return ((ObservableCollection)(this["AllPeople"])); } set { this["AllPeople"] = value; } } } } 

Veuillez noter que j’ai changé l’accessibilité de la classe Settings pour qu’elle soit public . (Je n’avais probablement pas besoin de faire ça).

Le seul inconvénient que j’ai vu dans toute cette solution / réponse est que vous ne pouvez plus modifier les parameters de configuration de l’application à l’aide de la boîte de dialog Projet -> Propriétés. Cela gâcherait sérieusement vos nouveaux parameters en vous convertissant en chaîne et en modifiant vos balises XML.

Parce que je voulais utiliser un seul fichier de configuration système à la place d’un fichier spécifique à l’utilisateur, j’ai également changé le global::System.Configuration.UserScopedSettingAtsortingbute()] en [global::System.Configuration.ApplicationScopedSetting()] . J’ai laissé l’access au set dans la classe, mais je sais que cela ne sauve pas réellement.

Merci d’avoir répondu! Cela rend mon code beaucoup plus propre et plus facile à gérer.