生成带有对象列表的树视图

Generate A treeview with a list of objects

我用的两个类如下

public class FoundDirectory 
{
     public string fullPath { get; set; }
     public string parent { get; set; }
     public string directoryName { get; set; }
     public ObservableCollection<FoundDirectory> subDirectories { get; set; }
     public ObservableCollection<FoundFile> subFiles { get; set; }

     public override string ToString()
     {
         return directoryName;
     }
}

public class FoundFile 
{
    public string fileName { get; set; }
    public string fullPath { get; set; }

    public long fileLength { get; set; }

    public override string ToString()
    {
        return fileName;
    }
}

我正在尝试通过递归硬盘驱动器扫描生成 TreeView。我将 ObservableCollection 传递给 TreeView。我可以让它显示正确嵌套的子目录,但根本无法让它显示子文件。我的XAML如下:

    <TreeView Name="directoryTree" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding Path=sortedDirList}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=subDirectories}">
                <StackPanel>
                    <TextBlock Text="{Binding Path=directoryName}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

我尝试了多种不同的方式来显示子文件,但似乎没有任何效果

您可以通过以下方式解决此问题:

public class Node
{
    public string FullPath { get; set; }
    public string Name { get; set;}
    public int Size {get;set;}
    public ObservableCollection<Node> Children {get; set;}

    public string ToString()
    {
        return Name;
    }
}

Xaml:

<TreeView Name="directoryTree" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding Path=sortedDirList}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
                <StackPanel>
                    <TextBlock Text="{Binding Path=Name}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

然后将 sortedDirList 设为仅包含根目录的列表,它应该会正确展开。

注意:class/variable 名称只是占位符,您可以随意重命名它们。

要递归地填充树,写这样的东西应该可行:

public void DirectorySearch(Node node)
{
    foreach(string f in Directory.GetFiles(node.Name))
    {
        //initialize a node with the file info
        node.Children.Add(fileNode);
    }
    foreach(var d in Directory.GetDirectories(node.Name)
    {
        //initialize a node with directory info
        node.Children.Add(dirNode);
        DirectorySearch(dirNode);
    }
}