Привязка Treeview (с «Папкой» между связанными узлами) - PullRequest
0 голосов
/ 15 марта 2012

У меня есть следующая проблема, с которой я борюсь сейчас около 5 часов.

Как правильно связать следующую структуру классов с TreeView?

public class Person
{
    public string Display { get; set; }
    public List<Car> Cars { get; set; }
    public List<House> Houses { get; set; }
}

public class Car
{
    public string Display { get; set; }
}

public class House
{
    public string Display { get; set; }
}

Я хочуTreeView имеет следующую структуру: (где у Person # 1 есть как дома, так и машины, а у Person # 2 только дома)

- Person #1
|-- Cars
  |-- Car #1
  |-- Car #2
|-- Houses
  |-- House #1
- Person #2
|-- Houses
  |-- House #1
  |-- House #2

Как, черт возьми, вы это делаете в XAML с автоматической привязкой данных к ObservableCollection?Я установил привязку только один раз в конструкторе моего Treeview (UserControl) следующим образом:

this.ItemsSource = SomeStaticClass.People;

Помощь очень, очень ценится!Спасибо!=)

РЕДАКТИРОВАТЬ: я пытался HierarchicalDataTemplate, но я не могу заставить его работать;)

EDIT2: я пробовал много разных вещей, но ближе всего я пришел к следующемукод (в настоящее время имеется только одно перечисление;)):

<HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Cars}">
    <TextBlock Text="{Binding Display}" />
    <HierarchicalDataTemplate.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Cars}">
            <TextBlock Text="Cars" />
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Display}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>

К сожалению, он не отображает автомобили TextBlock и автомобили сами.Как мне это сделать?

1 Ответ

0 голосов
/ 16 марта 2012

Наконец-то решено. Я только что вставил еще одну коллекцию классов между моим Персоном и Машиной (и, соответственно, Домом):

public class CollectionHolder<T> : IEnumerable
{
    public List<T> Items { get; set; }
    public string Display { get; set; }

    private List<CollectionHolder<T>> self;
    public CollectionHolder()
    {
        self = new List<CollectionHolder<T>>();
        self.add(this);
    }

    public IEnumerator GetEnumerator()
    {
        return self.GetEnumerator();
    }
}

А чем класс Человек:

public class Person
{
    public string Display { get; set; }
    public CollectionHolder<Car> Cars { get; set; }
    public CollectionHolder<House> Houses { get; set; }

    public IList Children
    {
        get
        {
            return new CompositeCollection
                {
                    new CollectionContainer { Collection = Cars },
                    new CollectionContainer { Collection = Houses }
                });//In real world: don't generate the list everytime!
        }
    }
}

И, наконец, мой XAML:

    <TreeView x:Name="trvData" Grid.Row="0" BorderThickness="0,0,0,1">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Display}" />
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Items}">
                        <TextBlock Text="{Binding Display}" />
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Display}" />
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
...