【发布时间】:2023-04-09 12:29:01
【问题描述】:
在我的 XAML 文件中,我有一个第 3 方(同步融合)DoubleTextBox 控件:
<syncfusion:DoubleTextBox x:Name="personAHeight" Style="{StaticResource SFDoubleTB}" />
当 DoubleTextBox 失去焦点时,它会将值复制到我创建的字典(XAML 元素和字典键具有完全相同的名称),以便保存键和值以在另一个页面上使用。
public static Dictionary<string, double> globalDictionary = new Dictionary<string, double>()
{
{"personAHeight", 0}, {"personBHeight", 0},
// over 100 keys & values
}
当 DoubleTextBox 失去焦点时(这已在样式中设置):
void SFTextBox_LostFocus(object sender, RoutedEventArgs e)
{
var tb1 = sender as DoubleTextBox;
if ((double) tb1.Value != 0)
{
if (App.globalDictionary.ContainsKey(tb1.Name))
{
App.globalDictionary[tb1.Name] = (double) tb1.Value; // always replace the value
}
else
{
App.globalDictionary.Add(tb1.Name, (double) tb1.Value); // add the entry to the dictionary in app.xaml.cs
}
}
}
所有这些都按预期工作。我还可以使用 SaveFileDialog 将使用 JSON 序列化的 globalDictionary 保存到文本文件中,然后再次打开该文件并对其进行反序列化。
private void saveProject_Click(object sender, RoutedEventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
if(saveFileDialog.ShowDialog() == true)
{
string jsonString = App.SerializeToJSONString();
File.WriteAllText(saveFileDialog.FileName, jsonString);
}
}
打开文件:
private void openProject_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == true)
{
string stringToDeserialize = File.ReadAllText(openFileDialog.FileName);
App.DeserializeJSONString(stringToDeserialize);
// read this data and then put the value back into XAML number box
}
}
反序列化 JSON 字符串
public static void DeserializeJSONString(string jsonString)
{
App.globalDictionary = JsonConvert.DeserializeObject<Dictionary<string, double>>(jsonString);
}
已保存文件中的所有值都已成功写回 globalDictionary。
我现在的问题是,在打开文件并读取内容后,是否有一种简单的方法可以通过自动迭代每个 XAML 元素将这些内容放回数字文本框中? 用户应该会自动看到所有值都已恢复。
蛮力方法是打开文件后执行以下操作。如果可能的话,我宁愿不这样做,因为我有超过 100 个元素。
personAHeight.Value = App.globalDictionary["personAHeight"];
...repeat x 100
我们将不胜感激任何替代建议。
【问题讨论】:
标签: c# json wpf xaml dictionary