Я думаю, все, что вам нужно сделать, это создать HierarchicalDataTemplate для каждого типа узла в вашем XML, загрузить его в XML XmlDataProvider , а затем связать , который в TreeView. Телевизор работает с XDP для связывания данных, и где-то вдоль линии они выясняют, какие HDT вы определили, и сопоставляют их DataType с именами узлов в вашем XML. У вас могут быть проблемы с изменением XPATH в зависимости от типа данных, но сохранение гибкости - это другой вопрос.
Например, у меня есть небольшое тестовое приложение для регулярных выражений. Он включает в себя справочную систему, в которой представлены все различные части регулярных выражений, перечисленные в дереве: категории и части с описаниями, всплывающими подсказками и другими элементами. Данные о деталях хранятся в виде источника данных xml. Поскольку он статический, я только что создал статический ресурс с ресурсами приложения:
<XmlDataProvider
x:Key="rxPartData"
XPath="RegexParts">
<x:XData>
<RegexParts
xmlns="">
<Category
Name="Character class"
ToolTip="Sets of characters used in matching">
<RegexPart
Regex="[%]"
Hint="Positive character group"
ToolTip="Matches any character in the specified group (replace % with one or more characters)" />
<!-- yadda -->
</Category>
</RegexParts>
</x:XData>
</XmlDataProvider>
Далее я создал HierarchicalDataTemplates для каждого типа узла в данных (опять же, все это в ресурсах приложения):
<!-- Category data template -->
<HierarchicalDataTemplate
DataType="Category"
ItemsSource="{Binding XPath=*}">
<TextBlock
Focusable="False"
Text="{Binding XPath=@Name}"
ToolTip="{StaticResource CategoryTooltip}"
ToolTipService.InitialShowDelay="0"
ToolTipService.ShowDuration="{x:Static sys:Int32.MaxValue}"
ToolTipService.HasDropShadow="True" />
</HierarchicalDataTemplate>
<!-- RegexPart data template -->
<HierarchicalDataTemplate
DataType="RegexPart"
ItemsSource="{Binding XPath=*}">
<WrapPanel
Focusable="False"
ToolTip="{StaticResource RegexPartTooltip}"
ToolTipService.InitialShowDelay="0"
ToolTipService.ShowDuration="{x:Static sys:Int32.MaxValue}"
ToolTipService.HasDropShadow="True">
<TextBlock
Text="{Binding XPath=@Regex}" />
<TextBlock
Text=" - " />
<TextBlock
Text="{Binding XPath=@Hint}" />
</WrapPanel>
</HierarchicalDataTemplate>
Наконец, я просто привязал дерево к XmlDataProvider:
<TreeView
Name="_regexParts"
DockPanel.Dock="Top"
SelectedItemChanged="RegexParts_SelectedItemChanged"
ItemsSource="{Binding Source={StaticResource rxPartData}, XPath=/RegexParts/Category}"
ToolTip="Click the + to expand a category; click a part to insert it">
</TreeView>
И это все, что вам нужно сделать. TreeView и XmlDataProvider позаботятся о поиске и использовании правильных HDT для правильных узлов в данных. Самая сложная часть всего этого - выяснение ваших путей xpath для связывания. Это может быть немного сложно, как если бы ваши пути были неправильными, вы в конечном итоге ничего не получите в дереве и не будет никаких ошибок (есть способы увеличить сообщения об ошибках в привязке данных в WPF, но это другой вопрос) ,