2010-11-18 65 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