popola treeview dall’elenco dei percorsi dei file in wpf

Ci sono diversi esempi su come popolare una vista ad albero da una collezione di percorsi di file come questo o questo altro esempio. Non riesco a trovare questo esempio per WPF. So di poter integrare i moduli di Windows e utilizzare un controllo diverso per farlo funzionare, ma sarebbe bello se potessi fare la stessa cosa con un controllo treeview wpf. La vista ad albero che voglio build è composta da circa 50.000 file quindi penso che sarà meglio se legarlo a qualcosa. Ma prima di legarlo, penso che sarà utile costruirne uno basato su un elenco di stringhe (le stringhe contengono i percorsi dei file).

Sono stato incuriosito dalla domanda e l’ho buttato insieme. Come primo passo penso di essere abbastanza vicino a quello che stai cercando. Parlare di circa 50.000 articoli mi fa pensare che il caricamento pigro possa essere appropriato. Ad ogni modo, ecco la versione semplice basata su un articolo di Josh Smith. Ho messo tutto il codice qui, ma la magia ha davvero luogo con i modelli di dati.

Considerate alcune classi per rappresentare gli oggetti con cui lavoriamo …

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

e…

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

e…

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

Ho creato un metodo ricorsivo per caricare alcune directory / file …

 using System.Collections.Generic; using System.IO; using WpfTreeViewBinding.Model; namespace WpfTreeViewBinding { public class ItemProvider { public List GetItems(string path) { var items = new List(); 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; } } } 

Da lì è solo questione di ottenere i dati …

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

E mostrandolo …

              

Tutta la magia accade davvero con i modelli di dati. Immagino che la chiave di tutto sia l’utilizzo di HierarchicalDataTemplate per tutti gli elementi con gerarchia (cioè le directory).

NOTA 1: Non l’ho testato estesamente. Non è stato profilato per le prestazioni. Vorrei dare il benvenuto a qualsiasi feedback, dato che questo è un problema che ho cercato di risolvere molto tempo fa e ho rinunciato. Grazie!

NOTA 2: è necessario impostare il percorso hard-coded su qualcosa che abbia senso sul proprio sistema.

Ecco uno screenshot che mostra directory e file a diversi livelli …

inserisci la descrizione dell'immagine qui

Piccola estensione per la soluzione precedente: ho aggiunto il codice xaml per supportare le icone e il supporto per il passaggio tra le icone per la cartella aperta e chiusa: