2011-07-27 3 views
2

시작하려면이 XML 파일에 재귀 부모 요소가 포함되어 있어야합니다. 여기에서는 XML 보이는 방법이다동적으로 콤보 상자 (wpf)를 생성하는 방법에 대한 아이디어가 필요합니다.

<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> 

I는 1 개 이상의 값 요소를 포함 아이디, 이름 및 값 어레이를 갖는 하나 개 이상의 VAR 소자를 포함 VARS 요소를 가지고있다.
value 요소의 sub_var 및 id 요소는 선택 사항이며 요소는 이름이 아닙니다. sub_var에는 VARS 등과 완전히 동일한 내용이 포함되어 있습니다.

이제 부모 comboBox 에서 선택한 내용을 기반으로 자식 콤보 상자를 생성하고 싶습니다. 예를 들어 사용자가 시작 지점 콤보 상자에서 "환경 1"을 선택하면 Env1 데이터 콤보 상자보다 Env1 값으로 생성되어야합니다. 그런 다음 사용자가 "Data1"을 선택하면 DB 콤보 상자 에 "place-holder 1"이 채워 져야합니다.

저는 몇 시간 동안이 작업을 해왔지만 어디에도 없습니다. 나는 1 레이어가 아닌 recursivley 작업을 얻을 수있었습니다, 그러나 여러 중첩 된 요소가 나에게 두통을주고있다. 지금 내가하는 일은 선택한 항목을 임시 변수에 저장 한 다음 내 선택 변경 이벤트 핸들러에서 스택 패널을 지우고 마지막으로 선택한 항목을 기반으로 모든 콤보 상자를 다시 만듭니다. 그러나 여러 중첩 된 요소가 제대로 작동하지 않는 것 같습니다.

저는 아이디어를 찾고 어떻게이 문제에 접근 할 것입니까?

답변

1

먼저,이처럼 보였다 클래스로 구조를 역 직렬화 것입니다 : 당신이 이런 짓을하면

class XmlVar 
{ 
    public List<XmlVar> Children { get; set; } 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

, 당신은 해당 노드에 대한 콤보를 만들 수 XmlVar에 메서드를 추가 할 수 있습니다. 다음과 같은 것 :

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 노드입니다.

1

DataType property을 통해 암시 적으로 적용 할 수있는 HierarchicalDataTemplates을 정의 할 수있는 적절한 C# 클래스로이를 deserialize 할 수 있습니다. 그런 다음 하나의 템플릿과 루트를 바인딩 할 수있는 ContentControl 또는 ItemsControl 루트를 만들어야하며, 필요에 따라 모든 것을 생성해야합니다.

관련 문제