.NET WPF - System.Windows.Controls.TreeView添加子项

时间:2009-06-05 18:08:36

标签: .net wpf treeview wpf-controls

将项目添加到System.Windows.Controls.TreeView的“根”级别后,按名称添加“子项”的正确方法是什么?

System.Windows.Controls.TreeView.Items< - 似乎没有名称的Find()或[]。

更新: 哦,等等......是TreeView.FindName()吗?

实际上看起来FindName不起作用,因为它返回一个对象,而不是你也可以添加子项。

在第二个笔记: 使用像这样的类来加载项是不对的,因为它没有像WinForms那样提供TreeNode?

public class TreeItem
{
    public string Name { get; set; }
    public string Text { get; set; }
    public object Tag { get; set; }
}

1 个答案:

答案 0 :(得分:1)

您可以在TreeView.Items集合上使用.Where ExtensionMethod,然后根据需要查找。

在WPF中不再有TreeNode,而TreeView具有TreeViewItems,ListView具有ListViewItems等。因此TreeViewItem就是您应该在这些情况下使用的。 (虽然你可以在TreeView中添加你喜欢的任何内容,但它会为你包装它。)

FindName返回一个对象,因为它不知道它将要找到什么,你必须将它转换为你期望的对象。但这就是你想要使用的行为。此外,如果在XAML中创建具有Name的任何元素,则会自动注册,但如果您在C#/ VB中创建项目并将其添加到UI,则情况并非如此。您必须“注册”他们的名字才能通过FindName()访问它。

这是一个演示TreeViewItem并通过FindName访问TreeView元素的小例子:

TreeView tree = new TreeView() { Name = "tree" };
uiDockPanel.Children.Add(tree);

var item1 = new TreeViewItem() { Header = "Item 1", Name = "Item1" };
tree.Items.Add(item1); 
item1.RegisterName("Item1", item1);

var item2 = new TreeViewItem() { Header = "Item 2", Name = "Item2" };
tree.Items.Add(item2); 
item1.RegisterName("Item2", item2);

var item3 = new TreeViewItem() { Header = "Item 3", Name = "Item3" ;
tree.Items.Add(item3);          
item1.RegisterName("Item3", item3);

var i2 = tree.FindName("Item2") as TreeViewItem;
var subitem = new TreeViewItem() { Header = "SubItem 1"};
i2.Items.Add(subitem);