将项目添加到System.Windows.Controls.TreeView的“根”级别后,按名称添加“子项”的正确方法是什么?
System.Windows.Controls.TreeView.Items< - 似乎没有名称的Find()或[]。
更新: 哦,等等......是TreeView.FindName()吗?
实际上看起来FindName不起作用,因为它返回一个对象,而不是你也可以添加子项。
在第二个笔记: 使用像这样的类来加载项是不对的,因为它没有像WinForms那样提供TreeNode? p>
public class TreeItem
{
public string Name { get; set; }
public string Text { get; set; }
public object Tag { get; set; }
}
答案 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);