没有集合的TreeView递归

时间:2011-01-20 18:54:38

标签: c# wpf templates treeview

如果您的数据是按集合组织的,则可以使用HierarchicalDataTemplates填充TreeView。但我有一些数据,保存在几个众所周知的类中,需要在TreeView中显示。这是一个代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace Test
{
    public class GroupWithList
    {
        public string Name { get; set; }

        public ObservableCollection<string> Items { get; set; }

        public GroupWithList(string name)
        {
            this.Name = name;
            this.Items = new ObservableCollection<string>();
        }
    }

    public class GroupWith2Children
    {
        public string Name { get; set; }

        public ObservableCollection<GroupWithList> Groups { get; set; }

        public GroupWithList First
        {
            get
            {
                return this.Groups[0];
            }
        }

        public GroupWithList Second
        {
            get
            {
                return this.Groups[1];
            }
        }

        public GroupWith2Children()
        {
            this.Name = "GroupWith2Children";
            this.Groups = new ObservableCollection<GroupWithList>();

            GroupWithList g;

            g = new GroupWithList("Letters");
            g.Items.Add("u");
            g.Items.Add("a");
            g.Items.Add("t");
            this.Groups.Add(g);

            g = new GroupWithList("Numbers");
            g.Items.Add("12");
            g.Items.Add("153");
            this.Groups.Add(g);
        }
    }
}

public partial class MainWindow : Window
{
    public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<GroupWith2Children>), typeof(MainWindow), new FrameworkPropertyMetadata(new ObservableCollection<GroupWith2Children>()));

    public ObservableCollection<GroupWith2Children> Items
    {
        get
        {
            return (ObservableCollection<GroupWith2Children>)this.GetValue(ItemsProperty);
        }

        set
        {
            this.SetValue(ItemsProperty, value);
        }
    }

    public MainWindow()
    {
        InitializeComponent();

        this.Items.Add(new GroupWith2Children());
        this.Items.Add(new GroupWith2Children());
    }
}

这是xaml代码:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:test="clr-namespace:Test"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>

            <DataTemplate DataType="{x:Type test:GroupWith2Children}">
                <TreeViewItem Header="{Binding Mode=OneWay, Path=Name}">
                    <TreeViewItem Header="First" ItemsSource="{Binding Mode=OneWay, Path=First.Items}"/>
                    <TreeViewItem Header="Second" ItemsSource="{Binding Mode=OneWay, Path=Second.Items}"/>
                </TreeViewItem>
            </DataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type test:GroupWithList}" ItemsSource="{Binding Path=Items}">
                <TextBlock Text="GroupWithList"/>
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type sys:String}">
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </Grid.Resources>

        <TreeView>
            <TreeViewItem Header="Root" ItemsSource="{Binding Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=Items}"/>
        </TreeView>
    </Grid>
</Window>

该示例工作正常,但您无法选择在DataTemplate for GroupWith2Children中生成的项目。似乎TreeView将整个模板视为一个项目。您只能选择根节点和整个子树“GroupWith2Children”。

使用集合替换GroupWith2Children对我来说不是一个选项。任何想法,我做错了什么?

1 个答案:

答案 0 :(得分:1)

您不必将GroupWith2Children替换为集合;你可以实现一个可枚举的属性。如果您根本无法触及GroupWith2Children类,请实现包装类:

public class GroupWrapper()
{
   public GroupWrapper(GroupWith2Children group)
   {
      Group = group;
   }

   public GroupWith2Children Group { get; private set; ]

   public IEnumerable<GroupWithList> Groups
   {
      get
      {
         yield return Group.First;
         yield return Group.Second;
      }
   }
}