WPF Databinding более сложная структура XML - PullRequest
0 голосов
/ 08 января 2009

Я задавал этот вопрос уже на форумах Microsoft, но до сих пор не получил ответа. Я застрял здесь. У меня есть довольно вложенный фрагмент xml, который я хотел бы связать с помощью иерархических шаблонов данных.

Вот фрагмент XML:

<project>
<products>    
<product name="Product2" foldername="string" dbkey="-2405" dbtable="string">   
          <inifiles>  
            <inifile name="string" dbkey="-3083" dbtable="string">   
              <sections>  
                <section name="string" dbkey="-3025" dbtable="string">   
                  <inientries>  
                    <inikey name="string" value="string" dbkey="9739" dbtable="string" />  
                  </inientries>  
                </section>  
              </sections>  
            </inifile>  
          </inifiles>  
          <subproducts>  
            <subproduct dbkey="1644" dbtable="string" name="Subproduct1">   
              <inifiles>  
                <inifile name="string" dbkey="-6544" dbtable="string">   
                  <sections>  
                    <section name="string" dbkey="2436" dbtable="string">   
                      <inientries>  
                        <inikey name="string" value="string" dbkey="-2122" dbtable="string" />  
                      </inientries>  
                    </section>  
                  </sections>  
                </inifile>  
              </inifiles>  
            </subproduct>  
            <subproduct dbkey="-4746" dbtable="string" name="Subproduct2">   
              <subinifiles>  
                <subinifile name="string" dbkey="7519" dbtable="string">   
                  <subsections>  
                    <subsection name="string" dbkey="1680" dbtable="string">   
                      <subinientries>  
                        <subinikey name="string" value="string" dbkey="3682" dbtable="string" />  
                      </subinientries>  
                    </subsection>  
                  </subsections>  
                </subinifile>  
              </subinifiles>  
            </subproduct>  
          </subproducts>  
        </product>  
    `</products>
</project>

Мои иерархические таблицы данных выглядят так:

<HierarchicalDataTemplate 
            DataType="product"
             ItemsSource="{Binding XPath=inifiles/inifile}"


            >
            <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16"
                       Source="Images/gnome-applications.png"/>
                <TextBlock Text="{Binding XPath=@name}" FontWeight="bold"/>

            </StackPanel>





        </HierarchicalDataTemplate>



        <!-- ######################### Ini-Files #########################################
        -->
        <HierarchicalDataTemplate 
            DataType="inifile"
             ItemsSource="{Binding XPath=sections/section}"
            x:Name="inifile"
            >
            <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16"
                       Source="Images/advanced.png"/>
                <TextBlock Text="{Binding XPath=@name}">
                     <TextBlock.ContextMenu>
                         <ContextMenu>

                        <Menu BorderThickness="3">

                            <MenuItem Header="{Binding XPath=@name}">

                                <MenuItem Header="_Find in Database"/>
                                <MenuItem Header="_Edit"  Tag="{Binding XPath=@value}"/>
                            </MenuItem>

                        </Menu>
                    </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
                <TextBlock Text="{Binding XPath=@key}"/>


            </StackPanel>
        </HierarchicalDataTemplate>






        <!-- ######################### Sections #########################################
        -->
        <HierarchicalDataTemplate
            DataType="section"
            ItemsSource="{Binding XPath=inientries/inikey}">
            <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16"
                       Source="Images/indent.png"/>
                <TextBlock Text="{Binding XPath=@name}">
                       <TextBlock.ContextMenu>
                         <ContextMenu>
                        <Menu>


                            <MenuItem  HorizontalAlignment="Stretch" 
                                       VerticalAlignment="Stretch" 
                                       Height="Auto"
                                       Width="Auto"
                                       Header="{Binding XPath=@name}">

                                <MenuItem Header="_Find in Database"/>
                                <MenuItem Header="_Edit"  
                                          Tag="{Binding XPath=@value}"/>
                            </MenuItem>

                        </Menu>
                    </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
                <TextBlock Text="{Binding XPath=@key}"/>
            </StackPanel>
        </HierarchicalDataTemplate>

        <!-- ######################### Ini-Keys #########################################
        -->
        <HierarchicalDataTemplate
            DataType="inikey">
            <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16"
                       Source="Images/keyring.png"/>
                <TextBlock Text="{Binding XPath=@name}">
                    <TextBlock.ContextMenu>
                         <ContextMenu>
                        <Menu>


                            <MenuItem  HorizontalAlignment="Stretch" 
                                       VerticalAlignment="Stretch" 
                                       Height="Auto"
                                       Width="Auto"
                                       Header="{Binding XPath=@name}">

                                <MenuItem Header="_Find in Database"/>
                                <MenuItem Header="_Edit"  
                                          Tag="{Binding XPath=@value}"  
                                          />
                            </MenuItem>

                        </Menu>
                    </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
                <TextBlock Text="{Binding XPath=@value}"/>
            </StackPanel>
        </HierarchicalDataTemplate>

Я могу связать все теги, кроме тега <subproducts>. Я мог прочитать структуру через XmlDocument, но я бы потерял все преимущества шаблонов.

Ответы [ 2 ]

0 голосов
/ 03 августа 2009

В вашем шаблоне "product" вы вызываете только файлы для детей:

ItemsSource="{Binding XPath=inifiles/inifile}"

Вам нужно изменить это так, чтобы вы также вызывали субпродукты. Что-то вроде:

ItemsSource="{Binding XPath=inifiles/inifile|subproducts}"

Вам необходимо проверить точный синтаксис XPath - я не проверял это.

0 голосов
/ 19 мая 2009

Я бы десериализовал ваш xml и затем использовал пользовательскую древовидную структуру следующего проекта:

http://www.codeproject.com/KB/WPF/versatile_treeview.aspx

У меня была похожая проблема (как получить пользовательский XML в виде дерева), и я нашел, что это решение отлично работает.

...