2013-02-13 80 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 
    { 
    } 
} 
相關問題