这似乎是一个常见的问题,但我无法从其他问题的答案中找到它。
我有一个公司,它有多个项目,每个项目可以有多个任务。公司类包含一些元数据以及它拥有的项目列表,项目类还包含一些元数据和它拥有的任务列表。我要做的是在树视图中显示此层次结构。我已经制作了一个公司的样本对象,它有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。
答案 0 :(得分:0)
您的分层数据模板会覆盖您的树视图。您必须将listofProject
和listofTask
重命名为相同名称。因此,您创建了Interface或Class。然后从此界面实现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>
答案 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" />