将数据保存在多个 ViewModel 中使用的文件中
Save data in file used in multiple ViewModels
所以我不确定我问这个问题是否正确,但我一直在自学 WPF,我想不出一种方法来保存用户在我的应用程序中输入的数据。
假设一个项目需要用户输入 IList<int>
个值。所以我有一个 class 存储该信息。如果用户已经输入并保存在应用程序中,则可以从 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
class就可以序列化了。
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);
}
}
然而这似乎是一种糟糕的方式来连接用户输入和我想保存在文件中的数据。
这是我想要实现的简化案例。但是我确信有更好的方法可以让我在 ViewModel
上加注 属性 时更改 Vault
中的值。理想情况下,可以使 UnitTest 变得简单(我还没有开始)。
如果有人能给我提供线索,让我找到更好的方法来处理这种情况,我将不胜感激。
这可能会被标记为范围太广,但通常您应该将数据序列化到数据库中。本文是一个很好的起点:
https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/new-database
如果您的数据结构非常精简,那么您可能想要使用 SQLite 之类的东西,它将数据库存储在本地文件中,并且不需要在您的应用程序中安装任何第 3 方应用程序。这里有很多关于如何使用 Entity Framework:
的信息
Entity Framework 6 with SQLite 3 Code First - Won't create tables
所以我不确定我问这个问题是否正确,但我一直在自学 WPF,我想不出一种方法来保存用户在我的应用程序中输入的数据。
假设一个项目需要用户输入 IList<int>
个值。所以我有一个 class 存储该信息。如果用户已经输入并保存在应用程序中,则可以从 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
class就可以序列化了。
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);
}
}
然而这似乎是一种糟糕的方式来连接用户输入和我想保存在文件中的数据。
这是我想要实现的简化案例。但是我确信有更好的方法可以让我在 ViewModel
上加注 属性 时更改 Vault
中的值。理想情况下,可以使 UnitTest 变得简单(我还没有开始)。
如果有人能给我提供线索,让我找到更好的方法来处理这种情况,我将不胜感激。
这可能会被标记为范围太广,但通常您应该将数据序列化到数据库中。本文是一个很好的起点:
https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/new-database
如果您的数据结构非常精简,那么您可能想要使用 SQLite 之类的东西,它将数据库存储在本地文件中,并且不需要在您的应用程序中安装任何第 3 方应用程序。这里有很多关于如何使用 Entity Framework:
的信息Entity Framework 6 with SQLite 3 Code First - Won't create tables