Нужны идеи о том, как динамически генерировать поля со списком (wpf) - PullRequest
2 голосов
/ 28 июля 2011

Для начала у меня есть этот 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 или более элементов VAR, которые имеют идентификатор, имя и массив значений, который содержит 1 или более элементов значения.
Элементы sub_var и id элемента value являются необязательными, имя Элемент нет. Sub_var содержит те же вещи, что и VARS и т. д.

Теперь я хочу создать дочерние поля со списком на основе того, что было выбрано в родительский comboBox. Например, если пользователь выбирает «Окружение 1» из Стартовая точка comboBox, чем поле со списком Env1 Data должно появиться с значения Env1. Затем, если пользователь выбирает «Data1», то поле со списком БД должен быть заполнен "заполнитель 1".

Я работаю над этим часами и никуда не денусь. Я смог получить 1 слой работает не рекурсивно, однако несколько вложенных элементов доставляют мне головную боль. Теперь я делаю это, сохраняя выбранный элемент во временной переменной, затем в выбранном мной обработчике измененных событий я очищаю панель стека и воссоздаю все поля со списком, основываясь на том, что было выбрано последним. Однако, похоже, это не работает должным образом с несколькими вложенными элементами.

Я просто ищу идеи и как бы вы подошли к этой проблеме.

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Во-первых, я бы десериализовал вашу структуру в класс, который выглядел следующим образом:

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, на который вы сейчас хотите нацелиться.

1 голос
/ 28 июля 2011

Я бы, вероятно, десериализовал бы это в надлежащие классы C #, чтобы вы могли определить HierarchicalDataTemplates, который может быть неявно применен через свойство DataType . Тогда вам просто нужно создать один такой шаблон и корень ContentControl или ItemsControl, к которому вы можете привязать свой корень, и он должен генерировать все по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...