以编程方式绑定到树视图在 UWP 中不起作用

Binding to a treeview programatically not working in UWP

我正在关注 this 文章以尝试以编程方式将数据绑定到树视图(我在 1903)。

在一个全新的 UWP 应用程序中,我有以下代码:

public MainPage()
{
    this.InitializeComponent();

    var items = new List<Item>();
    var rootItem = new Item();
    rootItem.Name = "Root Item";
    rootItem.Children.Add(new Item() { Name = "test child 1" });
    items.Add(rootItem);

    var treeView = new TreeView();
    treeView.ItemsSource = items;
    stackPanel.Children.Add(treeView);
}

Item 看起来像这样:

public class Item
{
    public string Name { get; set; }
    public ObservableCollection<Item> Children { get; set; } = new ObservableCollection<Item>();

    public override string ToString()
    {
        return Name;
    }
}

这似乎正是上述文章中概述的结构。但是,当我 运行 应用程序时,我得到这个:

我的猜测是我需要做,或者设置一些东西来告诉这个树视图,或者它有的集合 children - 但我看不出那可能是什么。

如果使用C#构建TreeView,我建议使用遍历添加TreeViewNode。

由于缺少说明,TreeView 不会自动处理Item 的Children。在您提供的文档中,TreeView 有一个 DataTemplate 指令,因此子项可以呈现。

您可以这样更改代码:

public MainPage()
{
    this.InitializeComponent();
    var items = new List<Item>();
    var rootItem = new Item();
    rootItem.Name = "Root Item";
    rootItem.Children.Add(new Item() { Name = "test child 1" });
    items.Add(rootItem);
    var treeView = new TreeView();

    foreach (var root in items)
    {
        var rootNode = new TreeViewNode() { Content = root.Name };
        if (root.Children.Count > 0)
        {
            foreach (var child in root.Children)
            {
                rootNode.Children.Add(new TreeViewNode() { Content = child.Name });
            }
        }
        treeView.RootNodes.Add(rootNode);
    }
    stackPanel.Children.Add(treeView);
}

此致。

您应该按照 docs 中的说明创建一个 ItemTemplate

您可以使用 XamlReader class 以编程方式执行此操作。像这样:

const string Xaml = "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><TreeViewItem ItemsSource=\"{Binding Children}\" Content=\"{Binding Name}\"/></DataTemplate>";
treeView.ItemTemplate = XamlReader.Load(Xaml) as DataTemplate;