2011-07-27 10 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> 

私は1つの以上の値の要素が含まれているID、名前と 値のアレイを有する1つの以上のVARの要素が含まれているVARS要素を持っています。
value要素のsub_var要素とid要素はオプションです。 という要素はありません。 sub_varには、VARS と全く同じものが含まれています。

親コンボボックス で選択されたものに基づいて子コンボボックスを生成します。 たとえば、ユーザーが 開始点comboBoxから「Enviornment 1」を選択した場合、Env1 DataコンボボックスよりもEnch1値が で生成されます。次に、ユーザーが "Data1"を選択した場合、DBコンボボックス には "プレースホルダ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#クラスにデシリアライズしています。次に、そのようなテンプレートとルートをバインドできるContentControlまたはItemsControlというルートを作成するだけで、必要に応じてすべてを生成する必要があります。

関連する問題