在xaml中生成树视图的层次结构

时间:2013-12-03 04:31:00

标签: c# wpf xaml treeview hierarchicaldatatemplate

这似乎是一个常见的问题,但我无法从其他问题的答案中找到它。

我有一个公司,它有多个项目,每个项目可以有多个任务。公司类包含一些元数据以及它拥有的项目列表,项目类还包含一些元数据和它拥有的任务列表。我要做的是在树视图中显示此层次结构。我已经制作了一个公司的样本对象,它有2个项目,而project1有2个任务。树视图应该一次只显示一个公司,因此根树视图是项目。

继承我对此问题的尝试,但没有显示任何内容。

<TreeView ItemsSource="{Binding listOfProjects}" Margin="10" Height="200">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding listOfTasks}" DataType="{x:Type local:Task}">
            <TreeViewItem Header="{Binding name}"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TreeViewItem Header="{Binding name}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

我如何才能使其正确无误?我应该将什么绑定到ItemsSource?对于TreeViewItem标头,如何让它知道要绑定哪个字段?目前,我有{绑定名称},但我如何区分它的来源(因为项目有一个字段'名称',任务也是如此)。

我将进一步扩展层次结构(一个任务可以包含多个部分,依此类推),但我假设每个额外的级别都与前两个级别相同。

编辑:这里是我的公司,项目和任务类。

class Company
{
    public List<Project> listOfProjects;
    public string name { get; set; }
    private int companyID { get; set; }

    public Company()
    {
        companyID = 0;
        name = "Default";
        listOfProjects = new List<Project>();
    }

    public Company(string inName)
    {
        companyID = 0;
        name = inName;
        listOfProjects = new List<Project>();
    }
} 
class Project
{
    private int projID { get; set; }
    public string name { get; set; }
    public DateTime startDate { get; set; }
    public DateTime endDate { get; set; }
    public string region { get; set; }
    private int companyID { get; set; }
    public List<Task> listOfTasks;

    public Project()
    {
        projID = 0;
        name = "Default";
        startDate = new DateTime();
        endDate = new DateTime();
        region = "Default";
        companyID = 0;
        listOfTasks = new List<Task>();
    }

    public Project(string inName)
    {
        projID = 0;
        name = inName;
        startDate = new DateTime();
        endDate = new DateTime();
        region = "Default";
        companyID = 0;
        listOfTasks = new List<Task>();
    }
}

除了构造函数之外,任务atm中没有任何内容。它有2个字段,projectID和name。

2 个答案:

答案 0 :(得分:0)

您的分层数据模板会覆盖您的树视图。您必须将listofProjectlistofTask重命名为相同名称。因此,您创建了Interface或Class。然后从此界面实现CompanyProjectTask

public interface ITreeItem
    {
        string Name { get; }
        List<ITreeItem> childs { get; }
    }


    public class Company : ITreeItem
    {

        public string Name
        {
            get { return name; }
        }

        public List<ITreeItem> childs
        {
            get { return listofProjects; }
        }
    }

    public class Project : ITreeItem
    {
        public string Name
        {
            get { return name; }
        }

        public List<ITreeItem> childs
        {
            get { return listofTask; }
        }
    }

    public class Task : ITreeItem
    {
        public string Name
        {
            get { return name; }
        }

public List<ITreeItem> childs
        {
            get { return null; }
        }
    }

然后你的模板是

<HierarchicalDataTemplate ItemsSource="{Binding childs}" DataType="{x:Type local:ITreeItem}">
            <TreeViewItem Header="{Binding Name}"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TreeViewItem Header="{Binding Name}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>

答案 1 :(得分:0)

所以顶层都是“project”类型,所有分支都是“task”类型的?您可以使用多个HierarchicalDataTemplates,如下所示:

<StackPanel.Resources>
    <sdk:HierarchicalDataTemplate x:Key="TaskTemplate" 
        ItemsSource="{Binding Path=Childs}"> 
       <TextBlock FontStyle="Italic" Text="{Binding Path=Name}" />
     </sdk:HierarchicalDataTemplate>
    <sdk:HierarchicalDataTemplate x:Key="ProjectTemplate" 
        ItemsSource="{Binding Path=ListOfTasks}" 
        ItemTemplate="{StaticResource TaskTemplate}">
        <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" />
        </sdk:HierarchicalDataTemplate>
</StackPanel.Resources>

然后像这样声明你的树视图......

<sdk:TreeView ItemsSource="{Binding MyProjectList}" 
    ItemTemplate="{StaticResource ProjectTemplate}" x:Name="myTreeView" />