WPF - 将名单列入树的好方法

Vac*_*ano 4 c# wpf tree listview list

我有一个如下所示的列表:

Base/Level1/Item1
Base/Level1/Item2
Base/Level1/Sub1/Item1
Base/Level2/Item1
Base/Level3/Sub1/Item1

我想要一个简单的方法将其放入ListView.(即类似于此)

Base
  |
  +->Level1
  |    |
  |    +=Item1
  |    +=Item2
  |    |
  |    +->Sub1
  |        |
  |        +=Item1
  |
  +->Level2
  |    |
  |    +=Item1

  |
  +->Level3
       |
       +->Sub1
           |
           +=Item1

有没有一种既定的方法来进行这种转换,还是只需要自己解析?

(如果它可能是相关的,我的代码中的实际项目是TFS迭代路径.)

Ray*_*rns 5

这将获取您的字符串列表并将其转换为适合使用TreeView查看的树,如您所述:

public IList BuildTree(IEnumerable<string> strings)
{
  return
    from s in strings
    let split = s.Split("/")
    group s by s.Split("/")[0] into g  // Group by first component (before /)
    select new
    {
      Name = g.Key,
      Children = BuildTree(            // Recursively build children
        from s in grp
        where s.Length > g.Key.Length+1
        select s.Substring(g.Key.Length+1)) // Select remaining components
    };
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个匿名类型的树,每个树包含一个Name属性和一个Children属性.这可以被直接结合到TreeView通过指定HierarchicalDataTemplateItemsSource="{Binding Children}"和内容组成的<TextBlock Text="{Binding Name}">或类似的.

或者,如果需要其他成员或语义,可以在代码中定义树节点类.例如,给定此节点类:

public class Node 
{
  public string Name { get; set; } 
  public List<Node> Children { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

你的BuildTree函数会略有不同:

public List<Node> BuildTree(IEnumerable<string> strings)
{
  return (
    from s in strings
    let split = s.Split("/")
    group s by s.Split("/")[0] into g  // Group by first component (before /)
    select new Node
    {
      Value = g.Key,
      Children = BuildTree(            // Recursively build children
        from s in grp
        where s.Length > g.Key.Length+1
        select s.Substring(g.Key.Length+1)) // Select remaining components
    }
    ).ToList();
}
Run Code Online (Sandbox Code Playgroud)

同样,这可以使用a直接绑定HierarchicalDataTemplate.我通常使用第一个解决方案(匿名类型),除非我想对树节点做一些特殊的事情.