在我的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不限制你輸入值,它只是簡化你的硬編碼設計,根據提供的字典動態地自動創建你的控件 –