从wpf中的文件path列表填充treeview

有几个如何从文件path集合(例如这个或另一个例子)填充树视图的例子。 我似乎无法findWPF的例子。 我知道我可以集成Windows窗体,并使用不同的控制,以使其工作,但它会是很好,如果我可以用wpf treeview控件做同样的事情。 我想要构build的树视图由大约50,000个文件组成,因此我认为如果将它绑定到某个东西上会更好。 但是首先在绑定之前,我认为基于List的string(string包含文件的path)构造一个是有帮助的。

我对这个问题很感兴趣,并把它们放在一起。 作为第一个传球我觉得我很接近你要找的东西。 谈论5万个项目虽然让我觉得懒加载可能是适当的。 无论如何,这里是基于Josh Smith的一篇文章的简单版本。 我把所有的代码放在这里,但是魔法确实发生在数据模板上。

给定几个类来表示我们正在使用的对象…

using System.Collections.Generic; namespace WpfTreeViewBinding.Model { public class Item { public string Name { get; set; } public string Path { get; set; } } } 

和…

 namespace WpfTreeViewBinding.Model { public class FileItem : Item { } } 

和…

 namespace WpfTreeViewBinding.Model { public class DirectoryItem : Item { public List<Item> Items { get; set; } public DirectoryItem() { Items = new List<Item>(); } } } 

我创build了一个recursion的方法来加载一些目录/文件…

 using System.Collections.Generic; using System.IO; using WpfTreeViewBinding.Model; namespace WpfTreeViewBinding { public class ItemProvider { public List<Item> GetItems(string path) { var items = new List<Item>(); var dirInfo = new DirectoryInfo(path); foreach(var directory in dirInfo.GetDirectories()) { var item = new DirectoryItem { Name = directory.Name, Path = directory.FullName, Items = GetItems(directory.FullName) }; items.Add(item); } foreach(var file in dirInfo.GetFiles()) { var item = new FileItem { Name = file.Name, Path = file.FullName }; items.Add(item); } return items; } } } 

从那里获取数据只是一个问题。

 using System.Windows; namespace WpfTreeViewBinding { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var itemProvider = new ItemProvider(); var items = itemProvider.GetItems("C:\\Temp"); DataContext = items; } } } 

并显示它…

 <Window x:Class="WpfTreeViewBinding.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Model="clr-namespace:WpfTreeViewBinding.Model" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <HierarchicalDataTemplate DataType="{x:Type Model:DirectoryItem}" ItemsSource="{Binding Items}"> <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" /> </HierarchicalDataTemplate> <DataTemplate DataType="{x:Type Model:FileItem}"> <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" /> </DataTemplate> </Window.Resources> <Grid Margin="8"> <TreeView ItemsSource="{Binding}" /> </Grid> </Window> 

所有的魔术真的发生在数据模板上。 我想整个事情的关键是使用HierarchicalDataTemplate任何具有层次结构(即目录)的项目。

注1:我还没有广泛testing这个。 它没有被performance出来。 我希望能有任何反馈,因为这是一个我很久以前想解决的问题,并且放弃了。 谢谢!

注2:您需要将硬编码path设置为您的系统上有意义的内容。

这是一个屏幕截图,显示不同级别的目录和文件。

在这里输入图像描述

以前解决scheme的小扩展:我添加了xaml代码来支持图标,并支持打开和closures文件夹的图标之间的切换:

  <HierarchicalDataTemplate DataType="{x:Type viewModels:SourceControlDirecoryViewModel}" ItemsSource="{Binding Items}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="5" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Image Width="16" Height="16" Source="{StaticResource ImageSourceFolderClosed16x16}" x:Name="img" /> <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" Grid.Column="2" /> </Grid> <DataTemplate.Triggers> <DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}}}" Value="True"> <Setter Property="Source" TargetName="img" Value="{StaticResource ImageSourceFolderOpened16x16}" /> </DataTrigger> </DataTemplate.Triggers> </HierarchicalDataTemplate>