2015-06-02 24 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

相关问题