Общий подход может быть выполнен следующим образом ;ИМХО это хороший подход для данных, если они действительно произвольны.
<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
более детальным образом.Если вы пойдете по этому пути, большой прогулки по должно быть достаточно для достижения того, что вы хотите.