使用具有不同嵌套类型的 HierarchicalDataTemplate

using HierarchicalDataTemplate with different nested types

似乎有大量关于 HierarchicalDataTemplate 的信息,但我很难找到足够具体的信息来帮助我处理包含不同类型的层次结构。

假设以下 class 结构:

public class classA
{
    public string name{get;set;}
}
public class classB
{
    public string name{get;set;}
    public List<classA> subItems{get;set;}
}
public class classC
{
    public string name{get;set;}
    public List<classB> subItems{get;set;}
}

现在假设 classes 不是自引用的原因,因此在我的层次结构中保持一种类型是它们包含的属性存在根本差异,有没有办法创建类型敏感分层数据模板?

HierarchicalDataTemplate 有一个 DataType 属性,因此您可以像 DataTemplate 一样使用它来指定类型。假设您将层次结构包装在视图模型中:

public class MyViewModel
{
    public List<classC> Items { get; set; }
}

然后像这样创建层次结构:

this.DataContext = new MyViewModel
{
    Items = new List<classC>
    {
        new classC
        {
            name = "Class C",
            subItems = new List<classB> {
                new classB{
                    name = "Class B1",
                    subItems = new List<classA>{
                        new classA {name="Class A1a"},
                        new classA {name="Class A1b"},
                        new classA {name="Class A1c"},
                    }
                },
                new classB{
                    name = "Class B2",
                    subItems = new List<classA>{
                        new classA {name="Class A2a"},
                        new classA {name="Class A2b"},
                        new classA {name="Class A2c"},
                    }
                }
            }
        }
    }
};

然后在 XAML 中,您需要做的就是将相关的 DataTemplates 和 HierarchicalDataTemplates 添加到 TreeView 的资源块中:

<TreeView ItemsSource="{Binding Items}">
    <TreeView.Resources>

        <DataTemplate DataType="{x:Type local:classA}" >
            <TextBlock Text="{Binding name}" Foreground="Blue" />
        </DataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:classB}" ItemsSource="{Binding subItems}" >
            <TextBlock Text="{Binding name}" Foreground="Green" />
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:classC}" ItemsSource="{Binding subItems}" >
            <TextBlock Text="{Binding name}" Foreground="Red" />
        </HierarchicalDataTemplate>

    </TreeView.Resources>
</TreeView>

结果: