WPF如何将自引用数据集绑定到TreeView?

3

我是WPF的入门者。我想将包含节点和关系的以下DataSet绑定到TreeView上。数据集如下:

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 现在,我通过递归检索所有数据表并将节点添加到树视图来实现此目标。但是,我希望有一个直接的XAML绑定。
我想补充一点,数据集将动态更改,并且可能存在许多嵌套层级。谢谢。
1个回答

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>

我如何使用对象列表作为数据源来实现这个?我找到了这个答案:https://dev59.com/d2zXa4cB1Zd3GeqPX9Bt 但是我无法理解那里提到的转换器。 - Lorgarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接