KrisTrip
KrisTrip

Reputation: 5043

Binding to TreeView in WPF

I am trying to bind some data from a class instance to a TreeView. My code is as follows:

public partial class MainWindow : Window
{        
    public MainWindow()
    {
        InitializeComponent();

        Parent myClass = new Parent();
        this.DataContext = myClass;
    }
}

public class Parent
{
    private List<string> children = new List<string>;

    public string Name {get;set;}
    public List<string> Children 
    {
        get { return this.children; } 
        set { this.children=value; }
    }

    public Parent()
    {
        this.Name = "Test";

        for (int i = 1; i <= 10; i++)
        {
            Children.Add(i.ToString());
        }
    }
}

And the XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:loc="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="287" Width="525">

    <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch">
        <TreeView Name="TreeView" ItemsSource="{Binding}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <TextBlock Text="{Binding Name}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </StackPanel>    
</Window>

Nothing shows up in my TreeView. What am I doing wrong?

I expect to see:

-Test
-- 1
-- 2
-- 3
etc

updated: to make Name and Children properties instead of public fields.
updated: added what I expect to see in TreeView

Upvotes: 1

Views: 2653

Answers (3)

VoidDweller
VoidDweller

Reputation: 1856

Here try this:

   <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch">
        <TextBlock Text="{Binding Name}"/>
        <TreeView Name="TreeView" ItemsSource="{Binding Children}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <TextBlock Text="{Binding}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </StackPanel>

A few things:

  • The 'Name' Property was out of scope.
  • We need to bind the TreeView as well as the DataTemplate
  • We use the default {Binding} to call ToString() on the current item.

Upvotes: 0

apandit
apandit

Reputation: 3344

You bind "myClass" of type Parent to the datacontext and use the same object for the ItemSource. This won't work because Parent is not an enumerable type.

Change your ItemSource binding from "{Binding}" to "{Binding Children}" and change your HierarchicalDataTemplate to just a DataTemplate.

If you want to retain myClass as a top level node, you could also wrap myclass in an IEnumerable and set that as the data context.

Upvotes: 2

Charlie
Charlie

Reputation: 15247

You can only bind to public properties, not fields. Change Name and Children to be public properties and this should work.

Upvotes: 0

Related Questions