因此,我不确定问我是否正确,但是我一直在自学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])
};
}
这样,当我按 Save 时,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变得容易(我还没有开始)。
如果有人可以为我提供线索以找到一种更好的方法来处理这种情况,我将不胜感激。
答案 0 :(得分:3)
这可能会因为范围太广而被标记出来,但是通常您应该将数据序列化到数据库中。本文是一个很好的起点:
https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/new-database
如果您的数据结构非常精简,那么您可能想要使用SQLite之类的东西,它可以将数据库存储在本地文件中,并且不需要与您的应用程序一起安装任何第三方应用程序。这里有很多有关如何使用Entity Framework的信息:
Entity Framework 6 with SQLite 3 Code First - Won't create tables