2016-02-22 2 views
0

Кажется, что в HierarchicalDataTemplate имеется тонна информации, но мне было трудно найти информацию, достаточно конкретную, чтобы помочь мне с иерархиями, содержащими разные типы.с использованием HierarchicalDataTemplate с различными вложенными типами

Предполагая следующую структуру класса:

public class classA 
{ 
    public string name{get;set;} 
} 
public class classB 
{ 
    public string name{get;set;} 
    public List<classA> subItems{get;set;} 
} 
public class classC 
{ 
    public string name{get;set;} 
    public List<classB> subItems{get;set;} 
} 

Теперь, принимая во предположении причину классы не являются самостоятельной ссылки, таким образом, сохраняя один тип на протяжении всей моей иерархии является то, что существуют принципиальные различия в свойствах содержатся theirin, есть способ создания типа HierarchicalDataTemplate?

+0

Вы пытались использовать DataTemplateSelector? Вы можете использовать его в своем HierarchicalDataTemplate, а затем выбрать dataTemplate, который хотите рассмотреть, что хотите. проверьте это: http://dotnetbeyond.blogspot.pt/2011/08/wpf-how-to-display-different-category.html – sexta13

ответ

2

HierarchicalDataTemplate имеет свойство DataType, поэтому вы используете это, чтобы указать тип так же, как и для DataTemplate. Допустим, вы заключаете иерархии в модели представления:

public class MyViewModel 
{ 
    public List<classC> Items { get; set; } 
} 

А затем создать свою иерархию следующим образом:

this.DataContext = new MyViewModel 
{ 
    Items = new List<classC> 
    { 
     new classC 
     { 
      name = "Class C", 
      subItems = new List<classB> { 
       new classB{ 
        name = "Class B1", 
        subItems = new List<classA>{ 
         new classA {name="Class A1a"}, 
         new classA {name="Class A1b"}, 
         new classA {name="Class A1c"}, 
        } 
       }, 
       new classB{ 
        name = "Class B2", 
        subItems = new List<classA>{ 
         new classA {name="Class A2a"}, 
         new classA {name="Class A2b"}, 
         new classA {name="Class A2c"}, 
        } 
       } 
      } 
     } 
    } 
}; 

Тогда в XAML все, что вам нужно сделать, это добавить соответствующие DataTemplates и HierarchicalDataTemplates к вашему блок ресурсов TreeView в:

<TreeView ItemsSource="{Binding Items}"> 
    <TreeView.Resources> 

     <DataTemplate DataType="{x:Type local:classA}" > 
      <TextBlock Text="{Binding name}" Foreground="Blue" /> 
     </DataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:classB}" ItemsSource="{Binding subItems}" > 
      <TextBlock Text="{Binding name}" Foreground="Green" /> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:classC}" ItemsSource="{Binding subItems}" > 
      <TextBlock Text="{Binding name}" Foreground="Red" /> 
     </HierarchicalDataTemplate> 

    </TreeView.Resources> 
</TreeView> 

Результат:

enter image description here

Смежные вопросы