1

将项目添加到 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; }
}
4

1 回答 1

1

您可以在 TreeView.Items 集合上使用.WhereExtensionMethod,然后按您想要的方式查找。

WPF 中不再有 TreeNode,而是 TreeView 有 TreeViewItems,ListView 有 ListViewItems 等。所以在这些情况下,您应该使用 TreeViewItem。(虽然你可以将任何你喜欢的东西添加到 TreeView,它会为你包装它。)

FindName 返回一个对象,因为它不知道要找到什么,您必须将其转换为您期望的对象。但这是您想要使用的行为。此外,虽然任何具有名称的元素在 XAML 中创建时都会自动注册,但如果您在 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);  
于 2009-06-05T20:16:31.373 回答