2013-02-13 1 views
0

У меня есть иерархия классов, которые я хочу отобразить в WPF TreeView.Могу ли я иметь разные классы на одном уровне иерархии TreeView?

  • Задача
    • Человек
    • Предметы
    • Дни

Классы включают строковые свойства и коллекции свойств. Это выглядит следующим образом:

  • Прачечная

    • Джон
    • Items Коллекция
      • Одежда
      • стиральный порошок
    • дней Коллекция
      • воскресенье
      • четверг
  • Торговые

    • Millie
    • товары
      • Деньги
      • Список
      • Сумки
      • автомобилей
    • Дни
      • Суббота

Я хотел бы, чтобы отобразить строки (лицо) как листья и быть в состоянии сверлить коллекции (Items, Days), чтобы добраться до строк внутри.

Я нашел это объяснение http://social.msdn.microsoft.com/forums/en-US/wpf/thread/e40e0a8f-7758-4b69-80f6-1c657294d019/, что хорошо работает для этого макета:

  • Задача
    • Человек
      • Items
        • Дни

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

ответ

0

Я думаю, что сработал. Дайте мне знать, если есть более разумный подход, чем этот.

Этот блог помог много, но, к сожалению, код пронизана опечаток:

David Sackstein's - HierarchicalDataTemplate and TreeView

Ключ в том, что каждый класс, который связан с TreeView является производным от BaseClass. Это позволяет вам получить различные типы в TreeView, привязывая его к коллекции своего базового класса. Затем в XAML вы можете создать HierarchicalDataTemplate для каждого типа DataType, и все будет работать.

enter image description here

<Window x:Class="HierarchicalDataTemplateAndTreeView.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:HierarchicalDataTemplateAndTreeView" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 

     <HierarchicalDataTemplate DataType="{x:Type local:Task}" ItemsSource="{Binding Path=Children}"> 
      <StackPanel Orientation="Horizontal" Margin="3"> 
       <TextBlock Text="{Binding Path=Name}" FontSize="16" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:Person}" ItemsSource="{Binding Path=Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Name}" Foreground="Purple" FontSize="14" FontWeight="Bold" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:ItemCollection}" ItemsSource="{Binding Path=Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Name}" Foreground="Blue" FontSize="12" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:Item}" ItemsSource="{Binding Path=Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Name}" Foreground="Blue" FontSize="11" FontStyle="Italic" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:DayCollection}" ItemsSource="{Binding Path=Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Name}" Foreground="RosyBrown" FontSize="12" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:Day}" ItemsSource="{Binding Path=Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Name}" Foreground="RosyBrown" FontSize="12" FontStyle="Italic" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

    </Window.Resources> 
    <StackPanel> 
     <TreeView Name="treeView"/> 
    </StackPanel> 
</Window> 

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Documents; 

namespace HierarchicalDataTemplateAndTreeView 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      treeView.ItemsSource = GetData(); 
     } 

     public List<Composite> GetData() 
     { 
      List<Composite> list = new List<Composite>() 
      { 
       new Task 
       { 
        Name = "Laundry", Children = new List<Composite>() 
        { 
         new Person { Name = "John" }, 
         new ItemCollection 
         { 
          Name = "Items", Children = new List<Composite>() 
          { 
           new Item { Name = "Clothes" }, 
           new Item { Name = "Washing Powder" } 
          } 
         }, 

         new DayCollection 
         { 
          Name = "Days", Children = new List<Composite>() 
          { 
           new Day { Name = "Sunday" }, 
           new Day { Name = "Thursday" } 
          } 
         } 
        } 
       }, 

       new Task 
       { 
        Name = "Shopping", Children = new List<Composite>() 
        { 
         new Person { Name = "Millie" }, 
         new ItemCollection 
         { 
          Name = "Items", Children = new List<Composite>() 
          { 
           new Item { Name = "Money" }, 
           new Item { Name = "List" }, 
           new Item { Name = "Bags" } 
          } 
         }, 

         new DayCollection 
         { 
          Name = "Days", Children = new List<Composite>() 
          { 
           new Day { Name = "Saturday" } 
          } 
         } 
        } 
       } 
      }; 

      return list; 
     } 
    } 
} 

using System.Collections.Generic; 

namespace HierarchicalDataTemplateAndTreeView 
{ 
    public class Composite 
    { 
     public string Name { get; set; } 
     public List<Composite> Children { get; set; } 
    } 

    public class Task: Composite 
    { 
    } 

    public class Person : Composite 
    { 
    } 

    public class ItemCollection : Composite 
    { 
    } 

    public class Item : Composite 
    { 
    } 

    public class DayCollection : Composite 
    { 
    } 

    public class Day : Composite 
    { 
    } 
}