2011-10-07 19 views
9

Nesnelerin bir koleksiyonunu kaydetme sorunu Uygulama Ayarları'na özel nesneler topluluğu depolamaya çalışıyorum. Ben tarayıcı düğmesi ile tip PeopleHolder özelliğini ekledi Settings.Settings Tasarımcısı'ndaUygulama Ayarları

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

ve 'Kullanıcı' olarak kapsamını ayarlayın: Burada this related question bazı yardımıyla

, Şu anda ne var. Kaydet() yöntemi başarıyla tamamlanmış gibi görünüyor, hata iletileri yok, ancak uygulama ayarlarını her yeniden başlattığımda kalıcı değil.

Yukarıdaki kodda gösterilmemesine rağmen, özel koleksiyonumu değil, yalnızca Strings'i kalıcı olarak kullanabiliyorum (Bende SO ile ilgili diğer sorularda farkettim, bazen hata ayıklama yaparken ayarları kaydetmeyi engelleyen sürüm numaralarıyla ilgili bir sorun olabilir) Olası suçlu olarak bunu dışlamak istiyorum.)

Herhangi bir fikrin var mı? Eminim bunu yapmak için çok basit bir yol var eminim :).

Yardımlarınız için teşekkürler!

cevap

10

this question teşekkürler! Tek ihtiyacım Aşağıdaki kod oldu sonra

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

Ve:

Bu soruya da önerildiği gibi ben Settings.Designer.cs bu katma

[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()); 
    } 
} 
+0

Bu kadar basit bir çözüm için teşekkürler. Benim için mükemmel çalış! – Seekeer

+0

+1 - Bir çekicilik gibi çalışır. Teşekkürler. :) –

+0

+1 Evet, benim için de aynı durumda çalışıyor. Ama belki de setup.Designer.cs hacking içermeyen daha zarif bir çözüm buldunuz? – beduin

3

size ObservableCollection<People> eklerseniz senin kendi kodu, ancak "Properties" ad alanını belirtin, bu değişikliği değiştirmeden yapabilirsiniz. design.esigner.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; 
      } 
     } 
    } 
} 

Lütfen dikkat, Settings sınıfının erişilebilirliğinipublic olarak değiştirdim. (muhtemelen bunu yapmak zorunda değildim). Bu çözümde/yanıtta gördüğüm tek dezavantaj, Proje -> Özellikler iletişim kutusunu kullanarak uygulama yapılandırma ayarlarında artık değişiklik yapamayacağınızdır. ciddi şekilde değerini değiştirerek, ayarlarınızı bir dizeye dönüştürerek ve XML etiketlerinizi yöneterek yeni ayarlarınızı bozar.

Kullanıcıya özgü bir dosya yerine tek bir sistem genelinde bir yapılandırma dosyası kullanmak istediğim için global::System.Configuration.UserScopedSettingAttribute()]'u [global::System.Configuration.ApplicationScopedSetting()] olarak değiştirdim. Sınıfta set erişimcisini bıraktım, ancak aslında kaydetmediğini biliyorum.

Cevabınız için teşekkürler! Kodumu çok daha temiz ve daha kolay yönetir.

+0

Bu ipucu için çok teşekkürler. Ayarlarımı zaten kaybettim Ayarlar.Designer.cs – thowa