3

I am a total beginner in WPF. I would like to bind the following DataSet containing nodes and relations to a TreeView. The dataset is:

internal static DataSet getData()
{
    DataTable dt = new DataTable("data");
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("ParentId", typeof(int));
    dt.Columns.Add("NodeDescription");

    dt.Rows.Add(1, null, "Employees");
    dt.Rows.Add(2, null, "Cars");
    dt.Rows.Add(3, 1, "Men");
    dt.Rows.Add(4, 1, "Women");
    dt.Rows.Add(5, 2, "BMW");
    dt.Rows.Add(6, 2, "Lexus");
    dt.Rows.Add(7, 3, "Adam Kowalski");
    dt.Rows.Add(8, 3, "Dawid Nowacki");
    dt.Rows.Add(9, 4, "Ilona Wacek");

    DataSet ds = new DataSet();
    ds.Tables.Add(dt);

    //add a relationship

    ds.Relations.Add("rsParentChild"
    ,ds.Tables["data"].Columns["Id"]
    ,ds.Tables["data"].Columns["ParentId"]);

    return ds;
} 

I would like to have:

alt text

Now I achieve this by resursive retrieveing all datatable and ading nodes to the treeview. However, I hope there is a direct XAML binding.

I'd like to add that the dataset will be dynamically changing and there might many nesting levels. Thanks.

Fredrik Hedblad
  • 83,499
  • 23
  • 264
  • 266
nan
  • 19,595
  • 7
  • 48
  • 80

1 Answers1

5

Here's a simple solution that works :

Code-behind

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        var dataSet = getData();
        _rootNodes = dataSet.Tables["data"].DefaultView;
        _rootNodes.RowFilter = "ParentId IS NULL";
        this.DataContext = this;
    }

    private DataView _rootNodes;
    public DataView RootNodes
    {
        get { return _rootNodes; }
    }

    internal static DataSet getData()
    {
        ...
    }

}

XAML

    <TreeView ItemsSource="{Binding RootNodes}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding rsParentChild}">
                <TextBlock Text="{Binding NodeDescription}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
  • How can I achive this with a List of objects as a DataSource? I found this answer: http://stackoverflow.com/questions/14161963/how-to-bind-self-referencing-table-to-wpf-treeview but I am unable to understand the converter mentioned there. – Lorgarn Jul 23 '15 at 10:31