我对这个问题很感兴趣并把它放在一起。作为第一次通过,我认为我非常接近您正在寻找的内容。不过,谈论 50,000 个项目让我认为延迟加载可能是合适的。无论如何,这是基于 Josh Smith 的 article 的简单版本。我把所有的代码都放在这里了,但神奇的是数据模板。
给定几个类来表示我们正在使用的对象...
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>();
}
}
}
我创建了一个递归方法来加载一些目录/文件...
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:我没有对此进行广泛的测试。它尚未针对性能进行分析。不过,我欢迎任何反馈,因为这是我很久以前尝试解决并放弃的问题。谢谢!
注意 2:您需要将硬编码路径设置为对您的系统有意义的内容。
这是一个屏幕截图,显示了不同级别的目录和文件...