2013-02-13 53 views
0

我有我想要在WPF TreeView中显示的类的层次结构。我可以在TreeView层次结构的同一级别有不同的类吗?

  • 任务
    • 项目

,这些类包括字符串属性和集合属性。它看起来像这样:

  • 洗衣

    • 约翰
    • 项目集合
      • 衣服
      • 洗衣粉
    • 天收集
      • 周日
      • 周四
  • 购物

    • 米莉
    • 项目
      • 名单
      • 周六

我想显示的字符串(人)为树叶,并能够钻入集合(Items,Days)到达内部的字符串。

,我发现这个解释http://social.msdn.microsoft.com/forums/en-US/wpf/thread/e40e0a8f-7758-4b69-80f6-1c657294d019/,为了这个布局运作良好:

  • 任务
      • 项目

但我不能工作,如何调整它在同一层次级别代表不同的类。所有帮助表示赞赏,尤其是一个例子

回答

0

我已经完成了,我想。让我知道是否有比这更明智的方法。

本博客文章帮了不少忙,但遗憾的是代码为百病之错别字:

David Sackstein's - HierarchicalDataTemplate and TreeView

的关键是,每一个绑定到TreeView类是从一个基类派生。这使您可以通过将不同类型绑定到它们的基类集合来获取不同的类型。然后在XAML中,您可以为每个DataType创建一个HierarchicalDataTemplate,并且一切正常。

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 
    { 
    } 
} 
相关问题