WPF中TreeView文件路径按文本框输入内容过滤问题求助
实现WPF TreeView目录/文件过滤功能
要实现根据文本框输入过滤TreeView中的路径元素,需要修改ItemProvider类,添加过滤逻辑并在递归遍历中传递过滤条件,同时处理目录自身不匹配但包含匹配子项时需保留目录的场景,具体修改如下:
修改后的ItemProvider代码
public class ItemProvider { // 添加filterText参数,用于接收过滤关键词 public List<Item> GetItems(string path, string filterText = "") { var items = new List<Item>(); var dirInfo = new DirectoryInfo(path); // 统一处理过滤条件,转为小写忽略大小写 var lowerFilter = filterText.ToLowerInvariant(); foreach (var directory in dirInfo.GetDirectories()) { // 递归获取当前目录的过滤后子项 var filteredSubItems = GetItems(directory.FullName, filterText); // 判断条件:目录名包含过滤词,或者子项有匹配结果 bool directoryMatches = string.IsNullOrEmpty(filterText) || directory.Name.ToLowerInvariant().Contains(lowerFilter); if (directoryMatches || filteredSubItems.Any()) { var item = new DirectoryItem { Name = directory.Name, Path = directory.FullName, Items = filteredSubItems }; items.Add(item); } } foreach (var file in dirInfo.GetFiles()) { // 文件直接判断名称是否包含过滤词 bool fileMatches = string.IsNullOrEmpty(filterText) || file.Name.ToLowerInvariant().Contains(lowerFilter); if (fileMatches) { var item = new FileItem { Name = file.Name, Path = file.FullName }; items.Add(item); } } return items; } }
关键逻辑说明
- 过滤条件传递:递归调用
GetItems时传入过滤文本,确保所有层级的目录和文件都参与过滤。 - 目录保留规则:即使目录名称不匹配过滤词,但只要它包含匹配的子目录或文件,就会被保留,保证过滤后的树形结构完整。
- 忽略大小写:将过滤文本和文件名/目录名统一转为小写,实现不区分大小写的模糊匹配。
使用方式
在文本框的文本变更事件中,获取输入内容并重新加载TreeView:
// 假设textFilter是你的过滤文本框 var filterText = textFilter.Text; var provider = new ItemProvider(); var rootItems = provider.GetItems(@"你的根路径", filterText); // 将rootItems绑定到TreeView的ItemsSource treeView.ItemsSource = rootItems;
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

