用于不止一种集合类型的 TreeView HierarchicalDataTemplates

TreeView HierarchicalDataTemplates for more than one collection type

我有一个 Projects 集合,其中包含两个集合(其中任何一个都可以为空):

class Project {  
    public string Name { get; set; }
    public int Priority { get; set; }
    public List<Project> Projects { get; set; }
    public List<Task> Tasks { get; set; }
}  

我可以获取要显示的嵌套项目:

<TreeView  x:Name="ProjectsTree" >
<TreeViewItem Header="Projects" 
              ItemsSource="{Binding ProjectsCollection, Mode=TwoWay}" 
              IsExpanded="True" >
    <TreeViewItem.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Project}"  ItemsSource="{Binding Projects}">
            <TextBlock Text="{Binding Name}"></TextBlock>
        </HierarchicalDataTemplate>
    </TreeViewItem.Resources>
</TreeViewItem>

如何为任务添加第二个模板?如果我添加:

<HierarchicalDataTemplate DataType="{x:Type local:Project}"  ItemsSource="{Binding Tasks}">
            <TextBlock Text="{Binding Name}"></TextBlock>
        </HierarchicalDataTemplate>  

我得到一个错误,关于资源字典中已经有数据类型 'Project'(或类似的东西)的条目。

所有帮助将不胜感激...

假设:Project 已给定且无法更改。这意味着在 MVVM 的上下文中 Project 是模型。您现在可以创建连接视图和模型的视图模型。它可能看起来像这样:

public class ProjectViewModel
{
    public Project Project { get; set; }

    public string Name
    {
        get
        {
            return Project.Name;
        }
    }

    public int Priority
    {
        get
        {
            return Project.Priority;
        }
    }

    public IList Children
    {
        get
        {
            if (Project.Projects.Count > 0)
            {
                return Project.Projects;
            }

            return Project.Tasks;
        }
    }
}

然后调整模板以适应视图模型,就完成了:

    <TreeView  x:Name="ProjectsTree" >
        <TreeViewItem Header="Projects" 
          ItemsSource="{Binding ProjectsViewModelCollection, Mode=TwoWay}" 
          IsExpanded="True" >
            <TreeViewItem.Resources>
                <HierarchicalDataTemplate DataType="{x:Type local:Project}"  ItemsSource="{Binding Children}">
                    <TextBlock Text="{Binding Name}"></TextBlock>
                </HierarchicalDataTemplate>
            </TreeViewItem.Resources>
        </TreeViewItem>