使用IsolatedStorageSettings为wp8中的应用永久存储信息

我正在使用IsolatedStorageSettings来存储我的应用程序中的一个键的联系人列表。 但应用程序只存储列表,直到应用程序处于活动状态(即像从一个页面导航到另一个页面一样)。 如果我退出应用程序并重新启动,找不到存储的密钥/联系人列表。 我如何永久保存一个应用程序的列表,直到应用程序安装? 这是我的viewmodel的代码,我正在使用:

public class ContactsViewModel : ViewModelBase { private static IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; private List<SavedContact> _SavedContactsList; public ContactsViewModel() { Contacts cons = new Contacts(); cons.SearchAsync(String.Empty, FilterKind.None, null); cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(OnContactSearchCompleted); SaveSavedContactsCommand = new RelayCommand(OnSaveSavedContacts); } private List<SavedContact> GetSavedContacts() { if (appSettings.Contains("SavedContacts")) { var savedContacts = (List<SavedContact>)appSettings["SavedContacts"]; return savedContacts; } else { return new List<SavedContact>(); } } public RelayCommand SaveSavedContactsCommand { get; set; } private void OnSaveSavedContacts() { if (!SavedContactsList.Any(x => x.IsSelected == true)) { MessageBox.Show("Please select some contacts and then click on Save button."); } else { var selectedSavedContacts = SavedContactsList.Where(x => x.IsSelected == true).ToList(); SavedContacts = selectedSavedContacts; MessageBox.Show("Emergency contact list added successfully."); App.RootFrame.GoBack(); } } void OnContactSearchCompleted(object sender, ContactsSearchEventArgs e) { try { SavedContactsList = new List<SavedContact>(); var allContacts = new List<Contact>(e.Results.Where(x => x.PhoneNumbers.Count() > 0).OrderBy(c => c.DisplayName)); // var savedContacts = GetSavedContacts(); var savedContacts = SavedContacts; foreach (Contact contact in allContacts) { SavedContact SavedContact = new SavedContact() { Contact = contact }; if (savedContacts.Any(x => x.Contact.PhoneNumbers.ElementAt(0).PhoneNumber == contact.PhoneNumbers.ElementAt(0).PhoneNumber)) { SavedContact.IsSelected = true; } else { SavedContact.IsSelected = false; } SavedContactsList.Add(SavedContact); } } catch (System.Exception ex) { MessageBox.Show("Error in retrieving contacts : " + ex.Message); } } [DataMember] public List<SavedContact> SavedContactsList { get { return _SavedContactsList; } set { _SavedContactsList = value; RaisePropertyChanged("SavedContactsList"); } } private List<SavedContact> SavedContacts { get { if (appSettings.Contains("SavedContacts")) { var savedContacts = (List<SavedContact>)appSettings["SavedContacts"]; return savedContacts; } else { return new List<SavedContact>(); } } set { appSettings["SavedContacts"] = value; } } } 

SavedContact类是以下内容:

  [DataContract] public class SavedContact : INotifyPropertyChanged { public SavedContact() { } private bool _isSelected; private Contact _contact; [DataMember] public bool IsSelected { get { return _isSelected; } set { if (_isSelected != value) { _isSelected = value; OnPropertyChanged("IsSelected"); } } } [DataMember] public Contact Contact { get { return _contact; } set { if (_contact != value) { _contact = value; OnPropertyChanged("Contact"); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } } 

视图模型绑定到<toolKit: LongListMultiSelector /> 。 function就像,我从长列表多select器中select一些联系人,并将其保存在存储器中,以便以后重用。 但是,如果我退出应用程序并重新启动它,savedContacts返回null。 当我在我的应用程序中导航其他页面时,savedContacts正在打印。 如果我第一次保存列表,在应用程序重新启动GetSavedContacts()返回一个新的列表。

Solutions Collecting From Web of "使用IsolatedStorageSettings为wp8中的应用永久存储信息"

该问题与IsolatedStorageSettings或您的RelayCommand 。 更详细地看问题是与Contact对象的序列化和反序列化。 如果你更新你的实现像下面的例子,你应该没问题。

 public class ContactsViewModel : ViewModelBase { private static IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; private List<UserContact> _contactList; public ContactsViewModel() { Contacts cons = new Contacts(); cons.SearchAsync(String.Empty, FilterKind.None, null); cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(OnContactSearchCompleted); SaveSavedContactsCommand = new RelayCommand(OnSaveSavedContacts); } public RelayCommand SaveSavedContactsCommand { get; private set; } private void OnSaveSavedContacts() { if (!Contacts.Any(x => x.IsSelected == true)) { MessageBox.Show("Please select some contacts and then click on Save button."); } else { var selectedSavedContacts = Contacts.Where(x => x.IsSelected == true).Select(x => new SavedContact{ Name = x.Contact.DisplayName, PhoneNumber = x.Contact.PhoneNumbers.ElementAt(0).PhoneNumber}).ToList(); SavedContacts = selectedSavedContacts; MessageBox.Show("Emergency contact list added successfully."); App.RootFrame.GoBack(); } } void OnContactSearchCompleted(object sender, ContactsSearchEventArgs e) { try { Contacts = new List<UserContact>(); var allContacts = new List<Contact>(e.Results.Where(x => x.PhoneNumbers.Count() > 0).OrderBy(c => c.DisplayName)); foreach (Contact contact in allContacts) { UserContact SavedContact = new UserContact() { Contact = contact }; if (SavedContacts.Any(x => x.PhoneNumber == contact.PhoneNumbers.ElementAt(0).PhoneNumber)) { SavedContact.IsSelected = true; } else { SavedContact.IsSelected = false; } Contacts.Add(SavedContact); } } catch (System.Exception ex) { MessageBox.Show("Error in retrieving contacts : " + ex.Message); } } [DataMember] public List<UserContact> Contacts { get { return _contactList; } set { _contactList = value; RaisePropertyChanged("Contacts"); } } public List<SavedContact> SavedContacts { get { if (appSettings.Contains("SavedContacts")) { var savedContacts = (List<SavedContact>)IsolatedStorageSettings.ApplicationSettings["SavedContacts"]; return savedContacts; } else { return new List<SavedContact>(); } } set { if (value != null) { IsolatedStorageSettings.ApplicationSettings["SavedContacts"] = value; IsolatedStorageSettings.ApplicationSettings.Save(); } } } } public class SavedContact { public string Name { get; set; } public string PhoneNumber { get; set; } } [DataContract] public class UserContact : INotifyPropertyChanged { public UserContact() { } private bool _isSelected; private Contact _contact; [DataMember] public bool IsSelected { get { return _isSelected; } set { if (_isSelected != value) { _isSelected = value; OnPropertyChanged("IsSelected"); } } } [DataMember] public Contact Contact { get { return _contact; } set { if (_contact != value) { _contact = value; OnPropertyChanged("Contact"); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } } 

添加到应用程序IsolatedStorageSettings中的键/值对将被保留,直到应用程序被卸载或从字典中移除项目。 在应用程序重新启动和设备开启和关闭时,情况都是如此。

您的SaveList方法可以简化为下面的示例,因为只有在从设置字典中检索值时才需要检查.Contains ,因为如果无法找到条目,它将引发异常。

 private void SaveList() { appSettings["SavedContacts"] = urls; } 

或者,您可以使用类似下面的示例来使用属性来处理对IsolatedStorageSettings的所有访问:

 private IList<Contact> Contacts { get { return appSettings.Contains("SavedContacts") ? (List<Contact>)appSettings["SavedContacts"] : null; } set { appSettings["SavedContacts"] = value; } }