开发者

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}">
            &l开发者_运维技巧t;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


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.


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


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.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜