2010-11-18 113 views
3

我是WPF的初学者。我想将包含节点和关系的以下DataSet绑定到TreeView。该数据集是:WPF如何将自引用数据集绑定到树视图

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; 
} 

我想有:

alt text

现在我通过resursive retrieveing所有的数据表和ading节点到TreeView实现这一目标。不过,我希望有一个直接的XAML绑定。

我想补充说,数据集将动态变化,并可能有很多嵌套级别。谢谢。

回答

5

这里有一个简单的解决方案,它的工作原理:

代码隐藏

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

辉煌!谢谢。 – nan 2010-11-18 13:30:51

+0

实体框架表呢? – ARZ 2013-01-05 15:07:39

+0

如何以对象列表作为数据源来存档?我发现这个答案:http://stackoverflow.com/questions/14161963/how-to-bind-self-referencing-table-to-wpf-treeview但我无法理解那里提到的转换器。 – Lorgarn 2015-07-23 10:31:17

相关问题