2015-06-02 61 views
0

在我的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 

任何替代建議將不勝感激。

回答

0

爲什麼不把你的100多個DoubleTextBox控件放在Listbox中並將這些DoubleTextBox定義爲數據模板?如:

<ListBox x:Name="myListBox"> 
     <ListBox.ItemTemplate> 
      <WrapPanel> 
      <Label Content={Binding Key} 
      <syncfusion:DoubleTextBox Style="{StaticResource SFDoubleTB}" Value={Binding Value}/> 
      </WrapPanel> 
     </ListBox.ItemTemplate> 
    </ListBox> 

,然後設置負荷後綁定到你的字典中的代碼:

myListBox.ItemsSource=App.globalDictionary; 
+0

我覺得一個列表框不會爲我的目的工作,因爲所有的變量需要用戶輸入值,另一頁將執行計算並顯示結果。我的應用程序基本上只是計算,我也希望它從設計的角度來看。 – greentea

+0

Listbox不限制你輸入值,它只是簡化你的硬編碼設計,根據提供的字典動態地自動創建你的控件 –

0
public void RestoreValues() 
{ 
    var controlContainer = VisualTreeHelper.GetChild(???, ???) as FrameworkElement; 
    if (controlContainer != null) 
    { 
     foreach (var keyValuePair in App.globalDictionary) 
     { 
      var doubleTextBox = controlContainer.FindName(keyValuePair.key) as syncfusion:DoubleTextBox; 
      if (doubleTextBox != null) 
       doubleTextBox.Value = keyValuePair.Value; 
     } 
    } 
} 
+0

謝謝,你的回答給了我想法,以搜索如何找到框架中的所有孩子。我有很多堆棧面板和網格元素,並且我在下面的鏈接中找到了我的答案:http://stackoverflow.com/questions/14875042/finding-all-child-controls-wpf – greentea

+0

非常歡迎。 – mdebeus

相關問題