Вот код, который я использовал для решения почти той же проблемы.
(Данные, для которых я разработал это XML-данные, поэтому XPath = "@ name" означает значение имени атрибута узла, а Name означает тип элемента.)
<Window x:Class="NodeExplorer2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:NodeExplorer2">
<Window.Resources>
<my:PathConverter x:Key="iconConverter"/>
<HierarchicalDataTemplate x:Key="XmlTreeTemplate">
<HierarchicalDataTemplate.ItemsSource>
<Binding XPath="child::node()" />
</HierarchicalDataTemplate.ItemsSource>
<StackPanel Orientation="Horizontal">
<Image x:Name="icon" SnapsToDevicePixels="True" Stretch="None" Margin="0,0,3,0" />
<TextBlock Text={Binding XPath="@name"/>
</StackPanel>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
<Setter TargetName="icon" Property="Source">
<Setter.Value>
<Binding Path="Name" Converter="{StaticResource iconConverter}">
<Binding.FallbackValue>
<ImageSource>
Data/Icons/unknown.png
</ImageSource>
</Binding.FallbackValue>
</Binding>
</Setter.Value>
</Setter>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
Преобразователь:
public class PathConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Console.WriteLine("Value:" + value);
return "Data/Icons/" + value + ".png";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return "";
}
}