2016-09-15 6 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"대신 "디렉토리 항목은"나는 여분의 것으로 검색되도록 두 개의 서로 다른 재귀 방법을 결합하는 시도했습니다 그 코드 시도의 명확성 부족으로 인해,하지만 더 나은 접근 방법이 궁금해?

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

아니요, (경로)의 모든 최상위 폴더를 하나의 디렉토리 클래스 유형으로 만들고 싶습니다. 그 아래에있는 것은 트리 레벨이 얼마나 깊은 지 상관없이 파일 또는 하위 폴더 클래스 유형이어야합니다. 내 treeview에서 최상위 디렉토리는 버튼과 모든 종류의 것들을 가지고 있으며 데이터 트리거 및 ivalueconverters 및 물건 xaml에서 차별화하는 데보다 깨끗한 방법이 될 것이라고 생각합니다. – ctalley5

답변

0

나는 그것을 알아낼 수 있었다. 첫 번째 목록 TopDirectoryOnly를 작성하여 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; 
    } 

}