HierarchicalDataTemplate не показывает дочерних элементов - почему бы и нет? - PullRequest
3 голосов
/ 17 марта 2012

Я пытаюсь максимально просто использовать HierarchicalDataTemplate для привязки вложенных данных к WPF TreeView. Почему-то дети моего дерева не видны:

enter image description here

Вот весь XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:src="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <TreeView Name="ctTree">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType = "{x:Type src:MyClass}"
                                      ItemsSource = "{Binding Path=Children}">
                <TextBlock Text="{Binding Path=Name}"/>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
</Window>

и за этим стоит все C #, кроме использования и пространства имен:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var collection = new ObservableCollection<MyClass>
        {
            new MyClass { Name = "parent one" },
            new MyClass { Name = "parent two" },
        };
        collection[0].Children.Add(new MyClass { Name = "child one" });
        collection[0].Children.Add(new MyClass { Name = "child two" });
        ctTree.ItemsSource = collection;
    }
}

class MyClass
{
    public string Name { get; set; }
    public ObservableCollection<MyClass> Children
        = new ObservableCollection<MyClass>();
}

Обратите внимание, что шаблон данных действительно применяется к элементам: данные берутся из свойства Name, и, если шаблон не применяется, вместо него будет отображаться "MyClass".

Как заставить детей показать? Кажется, я делаю то же самое, что и все примеры на HierarchicalDataTemplate.

Ответы [ 2 ]

7 голосов
/ 17 марта 2012

MyClass.Children - это поле, а не свойство.Вы не можете привязать поле, преобразовать поле Children в свойство, и тогда все должно работать:

class MyClass
{
    public string Name { get; set; }
    public ObservableCollection<MyClass> Children { get; private set; }

    public MyClass()
    {
        Children = new ObservableCollection<MyClass>();
    }
}
0 голосов
/ 17 марта 2012

Я думаю, Treeview.Resources - неподходящее место для этого.Вы хотите поместить свой шаблон в Treeview.ItemTemplate.

...