Multibind XML в TreeView - PullRequest
       13

Multibind XML в TreeView

1 голос
/ 01 марта 2011

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

-cards
  -category
    -card
    -card
    -category
      -card
      -card
      -card

<Window.Resources>
    <HierarchicalDataTemplate DataType="cards" ItemsSource="{Binding XPath=card}">
        <TextBlock Text="My Cards" />
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="category" ItemsSource="{Binding XPath=card}">
        <TextBlock Text="{Binding XPath=@name}" />
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="card" ItemsSource="{Binding XPath=category}">
        <TextBlock Text="{Binding XPath=@name}"/>
    </HierarchicalDataTemplate>

    <XmlDataProvider x:Key="dataxml" XPath="cards" Source="folder\cards.xml" />
</Window.Resources>

<TreeView Name="treeView" ItemsSource="{Binding Source={StaticResource dataxml}, XPath=.}" />

Образец XML:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <settings>
    ....
    ..
  </settings>
  <cards>
    <category name="C1">
        <card name="card1">
            <question>bla</question>
            <answer>blub</answer>
        </card>
        <category name="C2">
            <card name="card4">
                <question>bla</question>
                <answer>blub</answer>
            </card>
        </category>
    </category>
        <card name="card2">
            <question>bla</question>
            <answer>blub</answer>
        </card>
        <card name="card3">
            <question>bla</question>
            <answer>blub</answer>
        </card>
  </cards>
</root>

1 Ответ

0 голосов
/ 01 марта 2011

Общий подход может быть выполнен следующим образом ;ИМХО это хороший подход для данных, если они действительно произвольны.

       <HierarchicalDataTemplate x:Key="NodeTemplate">
            <TextBlock x:Name="tb"/>
            <HierarchicalDataTemplate.ItemsSource>
                <Binding XPath="child::node()" />
            </HierarchicalDataTemplate.ItemsSource>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
                    <Setter TargetName="tb" Property="Text" Value="{Binding Path=Value}"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                    <Setter TargetName="tb" Property="Text" Value="{Binding Path=Name}"></Setter>
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
       </HierarchicalDataTemplate>

       <XmlDataProvider x:Key="dataxml" XPath="root" Source="cards.xml"/>

Тогда TreeView будет выглядеть следующим образом ...

<TreeView HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="treeView"
                  ItemTemplate="{StaticResource NodeTemplate}"
                  ItemsSource="{Binding Source={StaticResource dataxml}, XPath=.}" />

Если данные непроизвольно я бы предложил проанализировать XML с помощью LINQ или другого метода и переместить данные в составной тип, который затем можно будет связать с помощью HierarchicalDataTemplate более детальным образом.Если вы пойдете по этому пути, большой прогулки по должно быть достаточно для достижения того, что вы хотите.

...