在我的XAML文件,我有一个第三方(syncfusion)DoubleTextBox控制:绑定词典<字符串,双>项到XAML数字文本块WPF
<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
}
}
}
所有这一切都按预期工作。我也可以使用JSON序列化将globalDictionary保存为文本文件,使用SaveFileDialog,然后再次打开文件并对其进行反序列化。
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
任何替代建议将不胜感激。
我觉得一个列表框不会为我的目的工作,因为所有的变量需要用户输入值,另一页将执行计算并显示结果。我的应用程序基本上只是计算,我也希望它从设计的角度来看。 – greentea
Listbox不限制你输入值,它只是简化你的硬编码设计,根据提供的字典动态地自动创建你的控件 –