2013-09-08 5 views
0

Привет У меня есть древовидная структура для отображения некоторых иерархических данных. Мои классы были следующими:ИерархияDataTemplate для добавления смешанных данных в treeview

public class Response 
{ 
    public string UserId { get; set; } 
    public CaseItems Cases { get; set; } 
} 

public class CaseItem 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public CaseFolders Folders { get; set; } 
} 

public class CaseFolder 
{ 
    public int FolderID { get; set; } 
    public string FolderName { get; set; } 
    public CaseItem Case { get; set; } 

    public CaseFolders Folders { get; set; } 
} 

public class CaseItems : List<CaseItem> { }; 

public class CaseFolders : List<CaseFolder> { }; 

public class Responses : List<Response> { }; 

Я создал некоторые тестовые данные, используя эти классы.

 Responses ResponseList = new Responses(); 
     Response response = new Response(); 
     response.Cases = new CaseItems(); 
     response.UserId = "USER 0001"; 
     ResponseList.Add(response); 

     CaseItem Case = new CaseItem(); 
     Case.Folders = new CaseFolders(); 
     Case.Name = "CASE0001"; 
     Case.ID = 1; 
     response.Cases.Add(Case); 

     CaseFolder MainFolder = new CaseFolder(); 
     MainFolder.FolderID = 1; 
     MainFolder.FolderName = "Case Folder"; 
     MainFolder.Folders = new CaseFolders(); 
     MainFolder.Case = Case; 
     Case.Folders.Add(MainFolder); 

     CaseFolder SubFolder = new CaseFolder(); 
     SubFolder.FolderID = 2; 
     SubFolder.FolderName = "Sub Folder"; 
     SubFolder.Case = Case; 
     MainFolder.Folders.Add(SubFolder); 

     Response AnotherResponse = new Response(); 
     AnotherResponse.Cases = new CaseItems(); 
     AnotherResponse.Cases.Add(Case); 
     AnotherResponse.UserId = "USER 0002"; 
     ResponseList.Add(AnotherResponse); 

     tvTest.DataContext = ResponseList; 

Часть XAML выглядит следующим образом

 <TreeView Name="tvTest" 
       ItemsSource="{Binding}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type local:Response}" 
             ItemsSource="{Binding}"> 
       <Label Content="{Binding UserId}"/> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type local:CaseItem}" 
             ItemsSource="{Binding Cases}"> 
       <Label Content="{Binding Path=Name}"/> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type local:CaseFolder}" 
             ItemsSource="{Binding ????}"> 
       <Label Content="{Binding Path=FolderName}"/> 
      </HierarchicalDataTemplate> 


     </TreeView.Resources> 
    </TreeView> 

Проблема в том, я не в состоянии отобразить данные вплоть до последнего суб уровне папок. Я видел много вопросов в wpf, но большинство из них имеют одинаковые классы в коллекции или вложенных коллекциях того же типа.

Возможно, я не могу изменить классы, чтобы возвращать CompositeCollection, так как я получаю данные с уровня данных.

Я смотрю на структуру как

User0001 
    Case0001 
    Main Folder 
     Sub Folder 
      sub...etc... 
User0002 
etc.... 

выше XAML, только показывает мне UserId из Resonse класса.

ответ

1

вам придется обновить свои шаблоны, как показано ниже:

 <TreeView Name="tvTest" 
       ItemsSource="{Binding}"> 
      <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type local:Response}" 
             ItemsSource="{Binding Cases}"> 
        <Label Content="{Binding UserId}"/> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:CaseItem}" 
             ItemsSource="{Binding Folders}"> 
        <Label Content="{Binding Path=Name}"/> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:CaseFolder}" 
             ItemsSource="{Binding Folders}"> 
        <Label Content="{Binding Path=FolderName}"/> 
       </HierarchicalDataTemplate> 


      </TreeView.Resources> 
     </TreeView> 

Благодаря

+0

вау! который работал как шарман. Не могли бы вы объяснить мне, что вы сделали. Я изо дня в день боролся за эту работу. –

+0

Ваш первый шаблон предназначен для первого уровня и, следовательно, для создания второго уровня, он должен иметь ItemsSource как Случаи и аналогичные для Case элементы. Папки - это ItemsSource и т. Д. – Nitin