以编程方式绑定到树视图在 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;
我正在关注 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;