TreeView HierarchicalDataTemplates适用于多种集合类型

时间:2016-05-15 20:51:32

标签: c# wpf treeview hierarchicaldatatemplate

我有一个包含两个集合的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>  

我收到的错误是资源字典中已存在数据类型&#39;项目&#39; (或类似的东西)。

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

1 个答案:

答案 0 :(得分:0)

假设: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>
相关问题