Добавление еще одного ответа, показывающего, как это сделать в чистом XAML.Это почти полностью основано на первоначальном втором решении canton7, которое было очень близко, но создавало массив TreeViewItems, которые перерабатывались.Обычно установка x:Shared="False"
должна исправить это, тот факт, что в его случае это не сработало, кажется мне ошибкой WPF.
В любом случае вместо создания массива элементов управления создайте массив данных.объекты.Введите sys: String будет хорошо работать в этом случае, с дополнительным бонусом, который мы также сможем использовать в качестве текста заголовка TreeViewItem позже:
<x:Array x:Key="DistributorItems" Type="{x:Type sys:String}">
<sys:String>Hardware</sys:String>
<sys:String>Inputs</sys:String>
<sys:String>Outputs</sys:String>
</x:Array>
Они представляют дочерние свойства в вашем LightDistributorучебный класс.Второй уровень вашего TreeView получит одну из этих строк, назначенную в качестве его DataContext, поэтому мы создадим стиль для них и будем использовать триггеры для установки ItemsSource
соответственно через DataContext родительского TreeViewItem:
<Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem">
<Style.Triggers>
<Trigger Property="DataContext" Value="Hardware">
<Setter Property="ItemsSource" Value="{Binding DataContext.Hardware, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=1}}" />
</Trigger>
<Trigger Property="DataContext" Value="Inputs">
<Setter Property="ItemsSource" Value="{Binding DataContext.Inputs, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=1}}" />
</Trigger>
<Trigger Property="DataContext" Value="Outputs">
<Setter Property="ItemsSource" Value="{Binding DataContext.Outputs, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=1}}" />
</Trigger>
</Style.Triggers>
</Style>
Остальная часть кода в основном совпадает с исходным кодом canton7, за исключением того, что я устанавливаю для ItemContainerStyle
LightDistributor стиль, который я создал выше, чтобы соответственно настроить ItemsSource:
<TreeView ItemsSource="{Binding LightDistributors}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type vm:LightDistributor}"
ItemsSource="{Binding Source={StaticResource DistributorItems}}"
ItemContainerStyle="{StaticResource TreeViewItemStyle}">
<TextBlock Text="{Binding Description}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type vm:Field}">
<TextBlock Text="{Binding Fieldname}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:Type}">
<TextBlock Text="{Binding TypeDescription}"/>
</DataTemplate>
</TreeView.Resources>
</TreeView>
Теперь простопоскольку это работает, это не значит, что это хорошее решение, но я по-прежнему придерживаюсь мнения, что первое решение canton7 - лучшее.Просто добавьте это, чтобы показать, что все-таки это можно сделать в чистом XAML.