树视图绑定(绑定节点之间有一个'文件夹')



我遇到了以下问题,我现在已经挣扎了大约5个小时。

如何将以下类结构正确绑定到TreeView?

public class Person
{
    public string Display { get; set; }
    public List<Car> Cars { get; set; }
    public List<House> Houses { get; set; }
}
public class Car
{
    public string Display { get; set; }
}
public class House
{
    public string Display { get; set; }
}

我希望TreeView具有以下结构:(1号人物既有房子又有车,2号人物只有房子)

- Person #1
|-- Cars
  |-- Car #1
  |-- Car #2
|-- Houses
  |-- House #1
- Person #2
|-- Houses
  |-- House #1
  |-- House #2

你到底是如何在XAML中自动绑定到ObservableCollection的?我在Treeview(UserControl)的Constructor中只设置了一次绑定,如下所示:

this.ItemsSource = SomeStaticClass.People;

非常感谢您的帮助!谢谢!=)

编辑:我尝试了层次结构数据模板,但无法使其工作;)

编辑2:我尝试了很多不同的东西,但最接近的是以下代码(此时只考虑一个枚举;):

<HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Cars}">
    <TextBlock Text="{Binding Display}" />
    <HierarchicalDataTemplate.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Cars}">
            <TextBlock Text="Cars" />
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Display}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>

不幸的是,它没有显示TextBlock汽车和汽车本身。我该怎么做?

最终解决。我刚刚在我的个人和汽车(分别为主页)之间插入了另一个类集合,如下所示:

public class CollectionHolder<T> : IEnumerable
{
    public List<T> Items { get; set; }
    public string Display { get; set; }
    private List<CollectionHolder<T>> self;
    public CollectionHolder()
    {
        self = new List<CollectionHolder<T>>();
        self.add(this);
    }
    public IEnumerator GetEnumerator()
    {
        return self.GetEnumerator();
    }
}

比个人类:

public class Person
{
    public string Display { get; set; }
    public CollectionHolder<Car> Cars { get; set; }
    public CollectionHolder<House> Houses { get; set; }
    public IList Children
    {
        get
        {
            return new CompositeCollection
                {
                    new CollectionContainer { Collection = Cars },
                    new CollectionContainer { Collection = Houses }
                });//In real world: don't generate the list everytime!
        }
    }
}

最后是我的XAML:

    <TreeView x:Name="trvData" Grid.Row="0" BorderThickness="0,0,0,1">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Display}" />
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Items}">
                        <TextBlock Text="{Binding Display}" />
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Display}" />
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

最新更新