TreeView рекурсия без коллекций - PullRequest
2 голосов
/ 20 января 2011

если ваши данные организованы в коллекции, вы можете заполнить TreeView с помощью HierarchicalDataTemplates.Но у меня есть некоторые данные, сохраненные в нескольких хорошо известных классах, которые должны отображаться в 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>

Пример работает нормально, но вы не можете выбрать элементы, сгенерированные вШаблон данных для GroupWith2Children.Кажется, что TreeView обрабатывает весь шаблон как один элемент.Вы можете выбрать только корневой узел и все поддерево "GroupWith2Children".

Заменить GroupWith2Children коллекцией - не вариант для меня.есть идеи, что я делаю не так?

1 Ответ

1 голос
/ 20 января 2011

Вам не нужно заменять 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;
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...