2014-01-09 4 views
0

В следующем XML ниже я хотел бы использовать hierarchicaldatatemplate с деревом WPF.Иерархический DataTemplate с проблемой XML DataSource с привязками

В зависимости от значения в типа Я собираюсь использовать различные изображения с именем рядом с ним, а затем, чтобы получить имя от значения из тега ид.

<key type='Configuration'> 
     <id field='name' value='Some value'/> 
    </key> 
    <key type='Container'> 
     <id field='name' value='MyName'/> 
     <key type='Container'> 
      <id field='name' value='Data12345'/> 
      <key type='Container'> 
       <id field='name' value='Data987655'/> 
       <key type='Circuit'> 
        <id field='name' value='Data63236723'/> 
       </key> 
      </key> 
     </key> 
    </key> 

Я попробовал некоторые из простых примеров, но ни один из них не показывает, как использовать HierarchicalDataTemplate с атрибутами, а также как получить текст с креплениями из атрибутов.

Было бы здорово, если бы кто-нибудь мог показать, как должен выглядеть иерархическийdatatemplate для этого XML, который будет использоваться с TreeView.

ответ

2

Сначала я думал, что вы не можете выполнить эти требования с помощью этой XML-схемы. Однако, после попытки его в тестовом проекте, кажется, что все это работает просто отлично:

enter image description here

Вы должны будете использовать XmlDataProvider для доступа к файлу XML:

<XmlDataProvider Source="/WpfApplication2;component/Xml/TestXMLFile.xml" 
    XPath="root/key" /> 

Вам также необходимо добавить root узел в XML, чтобы сделать его законным:

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <key type='Configuration'> 
     <id field='name' value='Some value'/> 
    </key> 
    <key type='Container'> 
     <id field='name' value='MyName'/> 
     <key type='Container'> 
      <id field='name' value='Data12345'/> 
      <key type='Container'> 
       <id field='name' value='Data987655'/> 
       <key type='Circuit'> 
        <id field='name' value='Data63236723'/> 
       </key> 
      </key> 
     </key> 
    </key> 
</root> 

Затем вам нужно добавить TreeView:

<TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource ItemTemplate}" /> 

И, наконец, добавьте HierarchicalDataTemplate в свой Resources раздел:

<HierarchicalDataTemplate x:Key="ItemTemplate" ItemsSource="{Binding XPath=key}" DataType="key"> 
    <StackPanel Orientation="Horizontal" Margin="0,2"> 
     <Image> 
      <Image.Style> 
       <Style> 
        <Setter Property="Image.Source" Value="Images/Default.png" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding [email protected]}" Value="Container"> 
          <Setter Property="Image.Source" Value="Images/Container.png" /> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding [email protected]}" Value="Configuration"> 
          <Setter Property="Image.Source" Value="Images/Configuration.png" /> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding [email protected]}" Value="Circuit"> 
          <Setter Property="Image.Source" Value="Images/Circuit.png" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 
     <TextBlock Text="{Binding XPath=id/@value}" Margin="5,0" /> 
    </StackPanel> 
</HierarchicalDataTemplate> 

Я действительно не хочу делать все это для вас, так что я оставлю вам настроить это по вашему вкусу. Надеюсь, от вас все будет в порядке.

+0

Спасибо за очень подробный хороший ответ, я не знал о триггерах стиля, который очень опрятен! «Binding XPath = id/@ value» действительно решило мою проблему! – StefanE