【问题标题】:Producing a hierarchy of treeview in xaml在 xaml 中生成树视图的层次结构
【发布时间】:2013-12-03 04:31:00
【问题描述】:

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

我有一家公司,有多个项目,每个项目可以有多个任务。公司类包含一些元数据以及它拥有的项目列表,项目类也有一些元数据和它拥有的任务列表。我想要做的是在树视图中显示这个层次结构。我制作了一个公司的样本对象,该公司有 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 标头,我如何让它知道要绑定哪个字段?目前,我有 {Binding name},但如何区分它的来源(因为项目有一个字段“名称”,任务也有)。

我将进一步扩展层次结构(一个任务可以有多个部分,依此类推),但我假设每个附加级别都将与前 2 个相同。

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

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>();
    }
}

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

【问题讨论】:

  • 你能分享你的数据模型的代码吗?
  • 我已将其添加到问题中。

标签: c# wpf xaml treeview hierarchicaldatatemplate


【解决方案1】:

您的分层数据模板会覆盖您的树形视图。您必须将 listofProjectlistofTask 重命名为相同的名称。因此,您创建接口或类。然后从该接口实现Company,Project,Task

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>

【讨论】:

  • 如果返回类型是 ITreeItem 而不是 Project/Task,孩子如何返回 listOfProjects/Tasks?
  • listOfProjects=新列表(); listOfProjects.Add(new Project());
【解决方案2】:

所以顶层都是“项目”类型,所有分支都是“任务”类型?您可以像这样使用多个 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" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多