[英]populate treeview from list of file paths in wpf
我對這個問題很感興趣,就把它放在一起。 作為第一次通過,我認為我非常接近您正在尋找的內容。 不過,談論 50,000 個項目讓我認為延遲加載可能是合適的。 無論如何,這是基於 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>();
}
}
}
我創建了一個遞歸方法來加載一些目錄/文件......
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:您需要將硬編碼路徑設置為對您的系統有意義的內容。
這是顯示不同級別的目錄和文件的屏幕截圖...
先前解決方案的小擴展:我添加了 xaml 代碼以支持圖標,並支持在打開和關閉文件夾的圖標之間切換:
<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.