Различные значки WPF Treeview в зависимости от типа узла

Мне нужно добавить изображения в узлы дерева WPF, я рассмотрел этот пример Как мне добавить значки рядом с узлами в WPF TreeView? и он работает нормально, за исключением того, что ВСЕ узлы имеют одинаковое изображение. Я хотел бы, чтобы все узлы в древовидное представление, у которого нет дочерних элементов, либо не имеет изображения, либо имеет другое изображение.

Вот мой XAML, где я установил изображение:

   <HierarchicalDataTemplate x:Key="NodeTemplate">
        <StackPanel Orientation="Horizontal" Margin="2">
            <Image Source="test.png"  Width="16" Height="16" SnapsToDevicePixels="True"/>
        <TextBlock x:Name="tb"/>
        </StackPanel>
        <HierarchicalDataTemplate.ItemsSource>
            <Binding>
                <Binding.XPath>child::node()</Binding.XPath>
            </Binding>
        </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>

Ниже скриншот вывода

Treeview outputМожет ли кто-нибудь предложить, как я могу этого добиться, возможное решение может заключаться либо в изменении XAML, либо программно через С#.


person Denys Wessels    schedule 25.11.2011    source источник


Ответы (1)


Вот код, который я использовал для решения почти той же проблемы. (Данные, для которых я разработал это, представляют собой данные 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 "";
    }
}
person AkselK    schedule 25.11.2011
comment
Привет, AkselK, я очень новичок в WPF, не могли бы вы объяснить, что такое ‹my:PathConverter x:Key=iconConverter/› и где в xaml должен быть размещен? Я помещаю его в тег ‹Window.Resources›, но я получаю следующая ошибка времени компиляции - my является необъявленным префиксом - person Denys Wessels; 25.11.2011
comment
Ах я вижу. my: — это пространство имен, объявленное в теге ‹window› или ‹usercontrol› в верхней части xaml. В моем случае я объявил my: as xmlns:my=clr-namespace:NodeExplorer2 В вашем случае это будет xmlns:my=clr-namespace:Your_project_name. Весь приведенный выше код объявлен в ‹Window.Resources› или ‹UserControl.Resources› над вашим первым реальным компонентом (возможно, ‹Grid›). my:PathConverter просто означает, что я объявляю объект типа PathConverter, а x:Key=iconConverter означает, что я могу сослаться на него с помощью {StaticResource iconConverter}. - person AkselK; 25.11.2011
comment
Круто, большое спасибо за объяснение! Мне просто нужно было добавить небольшой метод, который проверяет, есть ли у конкретного узла какие-либо дочерние элементы, и если НЕТ, то я меняю изображение узла на дочерний значок... Отмечая это как ответ - person Denys Wessels; 28.11.2011