首先,我有一个包含递归父子元素的XML文件。以下是XML的外观:
<VARS>
<VAR>
<id>var_starting_point</id>
<name>Starting Point</name>
<values>
<value>
<id>http://Environment1URL.com</id>
<name>Enviornment 1</name>
<sub_vars>
<VAR>
<id>var_env1_data</id>
<name>Env1 Data</name>
<values>
<value>
<name>Data1</name>
<sub_var>
<VAR>
<id>var_db</id>
<name>DB</name>
<values>
<values>place-holder 1</values>
</values>
</VAR>
</sub_var>
</value>
<value>
<name>Data2</name>
<sub_var>
<VAR>
<id>var_db</id>
<name>DB</name>
<values>
<values>place-holder 2</values>
</values>
</VAR>
</sub_var>
</value>
</values>
</VAR>
</sub_vars>
</value>
<value>
<id>http://Environment2URL.com</id>
<name>Enviornment 2</name>
<sub_vars>
<VAR>
<id>var_env2_data</id>
<name>Env2 Data</name>
<values>
<value>
<name>Data1</name>
<sub_var>
<VAR>
<id>var_db</id>
<name>DB</name>
<values>
<values>place-holder 1</values>
</values>
</VAR>
</sub_var>
</value>
<value>
<name>Data2</name>
<sub_var>
<VAR>
<id>var_db</id>
<name>DB</name>
<values>
<values>place-holder 2</values>
</values>
</VAR>
</sub_var>
</value>
</values>
</VAR>
</sub_vars>
</value>
</values>
</VAR>
<VAR>
<id>var_version_data1</id>
<name>Data1 Version</name>
<values>
<value>
<name>1.1.1</name>
</value>
</values>
</VAR>
<VAR>
<id>var_version_data2</id>
<name>Data2 Version</name>
<values>
<value>
<name>2.2.2</name>
</value>
</values>
</VAR>
</VARS>
我有一个VARS元素,其中包含一个或多个VAR元素,其中包含id,name和 values数组包含一个或多个值元素 value元素的sub_var和id元素是可选的名称 元素不是。 sub_var包含与VARS完全相同的东西 等等。
现在我想根据选择的内容生成子组合框 parent comboBox。 例如,如果用户从中选择“Enviornment 1” 起始点comboBox,而不是Env1数据组合框应该生成 Env1值。然后,如果用户选择“Data1”,则选择DB组合框 应填充“占位符1”。
我已经在这个工作了几个小时,我没有到达任何地方。我能够得到 1层工作非recursivley,但多个嵌套元素让我头疼。 我现在这样做的方法是,将所选项目保存到临时变量,然后在我的选择更改事件处理程序上清除我的堆栈面板并根据最后选择的内容重新创建所有组合框。但是,对于多个嵌套元素,这似乎不能正常工作。
我只是在寻找想法以及如何解决这个问题。
答案 0 :(得分:1)
我可能会将其反序列化为正确的C#类,这样您就可以定义HierarchicalDataTemplates
,可以通过DataType
property隐式应用。然后你应该只需要创建一个这样的模板和一个根ContentControl
或ItemsControl
,你可以绑定你的根,它应该根据需要生成所有内容。
答案 1 :(得分:1)
首先,我会将您的结构反序列化为类似这样的类:
class XmlVar
{
public List<XmlVar> Children { get; set; }
public string ID { get; set; }
public string Name { get; set; }
}
完成此操作后,您可以向XmlVar添加一个方法,为该节点创建ComboBox。像这样:
public ComboBox MakeNodeCombo()
{
ComboBox retval = new ComboBox();
if (Children != null)
{
foreach (XmlVar child in Children)
{
ComboBoxItem nextItem = new ComboBoxItem;
nextItem.Content = Name;
nextItem.Tag = child; // So we have an easy time choosing the child
retval.Add(nextItem);
}
}
return retval;
}
获取SelectedItem事件时,获取相应的ComboBoxItem。它的内容是名称,其标签是您现在要定位的子XmlVar节点。