Сохранить данные в файл, используемый в нескольких моделях представления - PullRequest
1 голос
/ 11 мая 2019

Так что я не уверен, правильно ли мне задавать этот вопрос, но я сам изучал WPF и не могу найти метод для сохранения данных, которые пользователь вводит в мое приложение.

Допустим, проект требует от пользователя ввода IList<int> значений.Итак, у меня есть класс, хранящий эту информацию.Эта информация может быть загружена из файла json, если пользователь уже ввел ее и сохранил в приложении.

public class Vault : BindableBase
{

    public Vault(string savedFilePath = null)
    {
        if (string.IsNullOrEmpty(savedFilePath))
        {
            Measures = new List<int> { 1, 2, 3, 4 };
        }
        else
        {
            Measures = (List<int>)JsonConverter.DeserializeObject<List<int>>(savedFilePath);
        }
    }

    public IList<int> Measures { get; set; }
}

Теперь, когда я создаю представление приложения, я хочу загрузить все ViewModels, которые будет использовать пользователь.В каждом ViewModel должен присутствовать элемент списка Measures.

public MainWindowViewModel()
{
    vault = new Vault(savedFilePath);

    Collection = new ObservableCollection<object>
    {
        new FirstViewViewModel(vault.Measures[0]),
        new SecondViewViewModel(vault.Measures[1])
    };

}

, чтобы при нажатии Сохранить класс Vault можно было сериализовать.

public void Save()
{
   File.WriteAllText(fileLocation, JsonConvert.SerializeObject(vault));
}

Поскольку я хочу изменить значения в Vault с помощью ввода пользователя, мне нужна прямая ссылка на него, поэтому в ViewModels я делаю

public class FirstViewViewModel : BindableBase
{
    private int _measure;

    public FirstViewViewModel(int measure)
    {
        _measure = measure;
    }

    public int Measure
    {
        get => _measure;
        set => SetProperty(ref _measure, value);
    }

}

Тем не менее это кажется ужасным способом связать пользовательский ввод с данными, которые я хочу сохранить в файле.

Это упрощенный случай того, чего я хочу достичь.Однако я уверен, что есть лучший способ, который позволил бы мне изменять значения в Vault при поднятии свойства на ViewModel.В идеале такой, который облегчит UnitTest (я еще не начал с этого).

Если бы кто-нибудь мог предложить мне подсказку, чтобы найти лучший способ справиться с такой ситуацией, я был бы очень признателен.

1 Ответ

3 голосов
/ 11 мая 2019

Вероятно, это будет помечено как слишком широкая область действия, но в целом вы должны сериализовать данные в базу данных.Эта статья - отличное место для начала:

https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/new-database

Если ваши структуры данных очень легкие, вы можете использовать что-то вроде SQLite, который хранит базу данных в локальном файле ине требует установки каких-либо сторонних приложений вместе с вашим приложением.Здесь много информации о том, как добиться того, чтобы это работало с Entity Framework:

Entity Framework 6 с первым кодом SQLite 3 - не будет создавать таблицы

...