.NET WPF - System.Windows.Controls.TreeView Добавление подэлементов - PullRequest
1 голос
/ 05 июня 2009

После того как вы добавили элементы на «корневой» уровень System.Windows.Controls.TreeView, как правильно добавить «подэлементы» по имени?

System.Windows.Controls.TreeView.Items <- кажется, не имеет Find () или [] по имени. </p>

UPDATE : Ой, подождите ... это TreeView.FindName ()?

На самом деле похоже, что FindName не будет работать, потому что он возвращает объект, а не то, что вы также можете добавить подпункты.

На второй ноте : Неверно ли использовать такой класс для загрузки элементов, поскольку он не предоставляет TreeNode, такой как WinForms?

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

1 Ответ

1 голос
/ 06 июня 2009

Вы можете использовать .Where ExtensionMethod в коллекции TreeView.Items, а затем находить по своему желанию.

В WPF больше нет TreeNode, вместо этого TreeView имеет TreeViewItems, ListView имеет ListViewItems и т. Д. Поэтому TreeViewItem - это то, что вам следует использовать в этих случаях. (Хотя вы можете добавить все, что вам нравится, в TreeView, он обернется для вас.)

FindName возвращает объект, потому что он не знает, что он собирается найти, вы должны привести его к тому, что вы ожидаете. Но это поведение, которое вы хотите использовать. Кроме того, хотя любые элементы с Именем автоматически регистрируются, если они создаются в XAML, это не так, если вы создаете элементы в C # / VB и добавляете их в пользовательский интерфейс. Вам нужно будет «зарегистрировать» их имя, чтобы получить доступ к нему с помощью FindName ().

Вот небольшой пример, демонстрирующий TreeViewItem и доступ к элементам TreeView через FindName:

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);  
...