【问题标题】:Need some ideas on how to generate combo boxes dynamically (wpf)需要一些关于如何动态生成组合框的想法(wpf)
【发布时间】:2011-07-28 09:37:02
【问题描述】:

首先,我有一个包含递归父子元素的 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 元素,其中包含 1 个或多个具有 id、名称和 包含 1 个或多个值元素的值数组。
value 元素的 sub_var 和 id 元素是可选的,名称 元素不是。 sub_var 包含与 VARS 完全相同的内容 等等。

现在我想根据在 父组合框。 例如,如果用户从 起始点组合框,比 Env1 数据组合框应该产生 Env1 值。然后如果用户选择“Data1”,那么 DB 组合框 应填充“占位符 1”。

我已经为此工作了好几个小时,但我一无所获。我能够得到 1 层非递归工作,但是多个嵌套元素让我头疼。 我现在这样做的方法是将所选项目保存到临时变量,然后在我的选择更改事件处理程序上清除我的堆栈面板并根据最后选择的内容重新创建所有组合框。但是,这似乎不适用于多个嵌套元素。

我只是在寻找想法以及您将如何解决这个问题。

【问题讨论】:

    标签: wpf xml combobox dynamic


    【解决方案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。它的 Content 是 Name,它的 Tag 是您现在要定位的子 XmlVar 节点。

    【讨论】:

      【解决方案2】:

      我可能会将其反序列化为适当的 C# 类,这样您就可以定义 HierarchicalDataTemplates,它可以通过 DataType property 隐式应用。然后你应该只需要创建一个这样的模板和一个根ContentControlItemsControl,你可以将你的根绑定到它,它应该会根据需要生成所有内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 2016-05-18
        相关资源
        最近更新 更多