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

Wob*_*les 1 c# wpf hierarchicaldatatemplate

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

假设以下类结构:

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;}
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*man 8

HierarchicalDataTemplate有一个DataType属性,所以你用它来指定类型DataTemplate.假设您将层次结构包装在视图模型中:

public class MyViewModel
{
    public List<classC> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后创建您的层次结构,如下所示:

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"},
                    }
                }
            }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

然后在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>
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述