Не работает шаблон TreeViewItem

189
24 января 2019, 11:20

Я пытаюсь кастомизировать элемент TreeView с помощью шаблонов. В дереве будет 2 уровня узлов (родитель и дочерний). Для каждого из них есть по шаблону:

<ControlTemplate TargetType="TreeViewItem" x:Key="ParentNodeTemplate">
            <StackPanel Orientation="Horizontal">                    
                <TextBlock Text="{TemplateBinding Header}" Margin="5,5,5,5"/>
                <Button Content="Обновить" Margin="5,5,5,5"/>
            </StackPanel>
        </ControlTemplate>

для родителя и

<ControlTemplate TargetType="TreeViewItem" x:Key="ChildNodeTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{TemplateBinding Header}"/>
            </StackPanel>
        </ControlTemplate>

для дочерних элементов. Шаблоны совсем простенькие исключительно для проверки работоспособности подхода. Само дерево в разметке выглядит просто:

<TreeView x:Name="tree"/>

Заполнение дерева происходит в коде таким образом:

foreach(var project in Service.MonitoredProjects)
        {
            TreeViewItem parentItem = new TreeViewItem()
            {
                Header=project.Name,
                Template = (ControlTemplate)this.FindResource("ParentNodeTemplate"),
            };
            foreach (var mainfile in project.MainFileList)
            {
                TreeViewItem childItem = new TreeViewItem()
                {
                    Header=mainfile.Name,
                    Template = (ControlTemplate)this.FindResource("ChildNodeTemplate")
               };
                (parentItem.Items[0] as TreeViewItem).Items.Add(childItem);
            }                
            tree.Items.Add(parentItem);               
        }

После всех этих манипуляций я получаю на выходе родительские элементы без возможности развернуть их. Хотя пошаговая проверка показала, что узлы-родители содержат в себе дочерние узлы. И вопрос мой в том, что я делаю не так и почему я не могу развернуть узлы?

Answer 1

Итак, с помощью @Андрей NOP я решил свою проблему. По итогу получилось следующее: Шаблон родителя:

<HierarchicalDataTemplate DataType="{x:Type local:MonitoredProject}" ItemsSource="{Binding MainFileList}">
    <StackPanel Orientation="Horizontal">
        <Image MaxHeight="30" MaxWidth="30" Source="Images\folder_closed.png" ContextMenu="{StaticResource parentNodeMenu}"/>
        <Label Content="{Binding Name}" Margin="5,5,5,5" Foreground="{Binding Match, Converter={local:Converter}}" VerticalContentAlignment="Center" FontSize="16" ContextMenu="{StaticResource parentNodeMenu}"/>
        <Button Content="Править" Margin="5,5,5,5" Click="EditProject_Clck" Tag="{Binding Name}"/>                               
    </StackPanel>
</HierarchicalDataTemplate>

Шаблон дочернего элемента:

<DataTemplate DataType="{x:Type local:MonitoredFile}">
    <StackPanel Orientation="Horizontal">
        <Image MaxHeight="35" MaxWidth="35" Source="{Binding SourceAdress, Converter={local:ImageConverter}}" ContextMenu="{StaticResource childNodeMenu}"/>
        <Label Content="{Binding Name}" Margin="5,5,5,5" Foreground="{Binding Match, Converter={local:Converter}}" VerticalContentAlignment="Center" FontSize="14" ContextMenu="{StaticResource childNodeMenu}"/>
    </StackPanel>
</DataTemplate>

Сам контрол:

<TreeView x:Name="tree" ItemsSource="{Binding Path=(local:Service.MonitoredProjects)}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="Expanded" Handler="TreeViewItem_Expanded"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

Спасибо неравнодушному товарищу за помощь!

READ ALSO
SQLite error (5): database is locked C# Dapper

SQLite error (5): database is locked C# Dapper

Использую в проекте SQLite (устанавливал через NuGet) и DapperВ проекте используется пул потоков для чтения из БД, запись в БД производится из отдельного...

221
Что такое принцип подстановки Liskov

Что такое принцип подстановки Liskov

Изучаю подходы к SOLID принципам

155
Наследование TreeNode

Наследование TreeNode

Хочу создать свою TreeNode - TreeINodeНаследую TreeNode в TreeINode

180