2015-09-07 3 views
0

У меня есть простое приложение WPF, которое позволяет пользователю управлять своими работниками. Пользователь может добавлять, удалять и редактировать рабочих. Я хотел бы запомнить пользователей и их работников после перезапуска приложения, поэтому я думаю, что мне нужно использовать настройки Visual Studio (я имею в виду файл и Settings класс). Мое приложение отображает окно входа в систему, пользователь вводит логин и пароль, а также отображает основные окна, позволяющие видеть и создавать рабочие места пользователя. Когда пользователь входит в систему, я хотел бы загрузить его список сотрудников, и после выхода из него я хотел бы сохранить измененный список. Я создал настройку под названием AllUsers типа UserCollection. Вот код этого простого класса и User класс:Настройки Visual Studio не работают

public class UserCollection 
{ 
    public UserCollection(IEnumerable<User> users = null) 
    { 
     Users=new List<User>(users ?? new List<User>()); 
    } 
    public List<User> Users; 
} 

public class User 
{ 
    public string Login { get; } 
    public string Password { get; } 
    public ObservableCollection<Worker> Workers { get; set; } 

    public User(string login, string password) 
    { 
     Login = login; 
     Password = password; 
     Workers=new ObservableCollection<Worker>(); 
    } 
} 

Тогда я написал класс PropertiesManager, который будет управлять параметрами, обновления и сохраняет их. Вот код:

public static class PropertiesManager 
{ 
    public static List<User> Users 
    { 
     get 
     { 
      if (Settings.Default.AllUsers == null) 
      { 
       Settings.Default.AllUsers=new UserCollection(); 
       Settings.Default.Save(); 
      } 
      return Settings.Default.AllUsers.Users; 
     } 
     set 
     { 
      Settings.Default.AllUsers.Users = value; 
      Settings.Default.Save(); 
     } 
    } 
    public static User VerifyUser(string login, string password) 
    { 
     User current = Users.FirstOrDefault(x => x.Login.Equals(login)); 
     if (current == null) 
     { 
      current=new User(login,password); 
      Users.Add(current); 
      SaveUser(); 
     } 
     return current; 
    } 

    public static void SaveUser() 
    { 
     Settings.Default.Save(); 
    } 
} 

Я также думаю, что Settings.settings файл может быть полезным:

<?xml version='1.0' encoding='utf-8'?> 
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01 /settings" CurrentProfile="(Default)" GeneratedClassNamespace="HRManger.Properties" GeneratedClassName="Settings"> 
<Profiles /> 
<Settings> 
    <Setting Name="AllUsers" Type="HRManger.UserCollection" Scope="User"> 
     <Value Profile="(Default)" /> 
    </Setting> 
</Settings> 
</SettingsFile> 

Я заметил, что когда я войти как user1 добавить несколько рабочих и выйти из системы, а затем сделать то же самое, user2 и снова войдите в систему как user1, его рабочие отображаются правильно. Однако, когда я перезапущу приложение, я потеряю все. Я не знаю, что я сделал не так. Забыл ли я о чем-то важном?

+0

О, я знаю, что могу сохранить общий тип '' List в настройках, когда я пишу '<Установка Name = "AllUsers" Тип = "System.Collections.Generic.List <HRManager.Model.User>" Scope =» Пользователь ">', но это не имеет значения – bakala12

ответ

0

Я нашел причину, по которой настройки не были сохранены и восстановлены должным образом, поэтому я отправляю этот ответ. Чтобы понять, почему это происходит, нужно понимать, как работает Visual Studio settings. Известно, что это довольно распространенный XML serialization, поэтому он имеет несколько требований.

Только нестатические и нечитаемые поля и свойства сериализуются, и мы должны иметь непараметрированный конструктор по умолчанию в классе, чтобы гарантировать, что этот класс может быть сериализован как XML. Итак, в этом вопросе мы хотим сериализовать коллекцию объектов User, поэтому общий тип (в данном случае User) должен иметь непараметрированный конструктор. Это основная причина, почему это не работает.

Смежные вопросы