2016-09-15 4 views
0

Я пытаюсь собрать древовидную структуру с папками смешанных классов. Корневые папки один класс и вложенные папки другого, например:Treeview с разными классами папок

Root Folder #1 <-- DirectoryItem class 
--Sub Folder <-- SubDirectoryItem class 
----file  <-- FileItem class 
Root Folder #2 <-- DirectoryItem class 
--Sub Folder <-- SubDirectoryItem class 
----file  <-- FileItem class 

Я пытается объединить два различных рекурсивных методов, так что вложенные папки извлекаются как «SubDirectoryItems» вместо «DirectoryItem» Я избавлю эта попытка кода из-за отсутствия уточнения, но мне интересно, есть ли лучший подход?

class ItemProvider 
{ 
    public List<Item> GetItems(string path, SearchOption searchOption) 
    { 
     var items = new List<Item>(); 
     var dirInfo = new DirectoryInfo(path); 

     foreach (var directory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)) 
     { 
      var item = new DirectoryItem 
      { 
       Name = directory.Name, 
       Path = directory.FullName, 
       Items = GetItems(directory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     foreach (var subdirectory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)) 
     { 
      var item = new SubDirectoryItem() 
      { 
       Name = subdirectory.Name, 
       Path = subdirectory.FullName, 
       Items = GetItems(subdirectory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     foreach (var file in dirInfo.GetFiles()) 
     { 
      var item = new FileItem 
      { 
       Name = file.Name, 
       Path = file.FullName 
      }; 

      items.Add(item); 
     }  

     return items; 
    } 

} 

}

+0

Я здесь смущен. Что именно вы ищете? Предполагаете ли вы, что в любой момент времени будет только одна подпапка (уровень, такой как дополнительные папки внутри подпапки)? По существу; Подпапка также является элементом каталога. – A3006

+0

Нет, я хочу сделать все папки верхнего уровня в (пути) одним типом класса каталога. Все, что под ним должно быть либо файлами, либо типом типа подпапки, независимо от того, насколько глубоки уровни деревьев. В моем древовидном виде у каталогов верхнего уровня будут кнопки и всевозможные вещи, и я думаю, что это будет более чистый способ добиться, чем разделить его на xaml с триггерами данных и ivalueconverters и т. Д. – ctalley5

ответ

0

Я был в состоянии понять это. Я сделал первый список TopDirectoryOnly, затем потянул остальные элементы через 2-й список для AllDirectories. Вот код, если он помогает любым другим новичкам (например, мне):

class ItemProvider 
{ 
    public List<Item> GetItems(string path, SearchOption searchOption) 
    { 
     var items = new List<Item>(); 
     var dirInfo = new DirectoryInfo(path); 

     foreach (var directory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)) 
     { 
      var item = new DirectoryItem 
      { 
       Name = directory.Name, 
       Path = directory.FullName, 
       Items = GetSubItems(directory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     return items; 
    } 

    public List<Item> GetSubItems(string path, SearchOption searchOption) 
    { 
     var items = new List<Item>(); 
     var dirInfo = new DirectoryInfo(path); 


     foreach (var subdirectory in dirInfo.GetDirectories("*.*", SearchOption.AllDirectories)) 
     { 
      var item = new SubDirectoryItem() 
      { 
       Name = subdirectory.Name, 
       Path = subdirectory.FullName, 
       Items = GetSubItems(subdirectory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     foreach (var file in dirInfo.GetFiles()) 
     { 
      var item = new FileItem 
      { 
       Name = file.Name, 
       Path = file.FullName 
      }; 

      items.Add(item); 
     } 

     return items; 
    } 

}