1

WPFTreeViewに表示したいクラスの階層があります。

  • タスク
    • アイテム
    • 日々

クラスには、文字列プロパティとコレクションプロパティが含まれます。次のようになります。

  • ランドリー

    • ジョン
    • アイテムコレクション
      • 粉末洗剤
    • デイズコレクション
      • 日曜日
      • 木曜日
  • 買い物

    • ミリー
    • アイテム
      • お金
      • リスト
      • バッグ
      • 車両
    • 日々
      • 土曜日

文字列(Person)を葉として表示し、コレクション(Items、Days)にドリルダウンして、内部の文字列に到達できるようにしたいと思います。

このレイアウトに適した説明http://social.msdn.microsoft.com/forums/en-US/wpf/thread/e40e0a8f-7758-4b69-80f6-1c657294d019/が見つかりました。

  • タスク
      • アイテム
        • 日々

しかし、同じ階層レベルで異なるクラスを表すように調整する方法を理解することはできません。すべての助け、特に例。

4

1 に答える 1

2

私はそれを解決したと思います。これよりも賢明なアプローチがあるかどうか教えてください。

このブログ投稿は大いに役立ちましたが、残念ながらコードにはタイプミスがたくさんあります。

DavidSacksteinの-HierarchicalDataTemplateとTreeView

重要なのは、TreeViewにバインドされているすべてのクラスが基本クラスから派生していることです。これにより、TreeViewを基本クラスのコレクションにバインドすることにより、さまざまなタイプをTreeViewに取り込むことができます。次に、XAMLで、DataTypeごとにHierarchicalDataTemplateを作成でき、すべてが正常に機能します。

ここに画像の説明を入力してください

<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
    {
    }
}
于 2013-02-14T02:46:00.907 に答える