2009-06-05 19 views
1

System.Windows.Controls.TreeViewの "ルート"レベルにアイテムを追加した後、 "サブアイテム"を名前で追加する適切な方法?.NET WPF - System.Windows.Controls.TreeViewサブアイテムの追加

System.Windows.Controls.TreeView.Items < - 名前でFind()または[]がありません。

更新: ああ、待って...それはTreeView.FindName()ですか?

実際にFindNameはオブジェクトを返すため機能しません。サブタイトルを追加することはできません。第二のノートで

: は、それはWinFormsのようなツリーノードを提供していないため、アイテムとそれをロードするために、このようなクラスを使用することが間違っていますか?

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

答えて

1

あなたはTreeView.Itemsコレクションに.Where ExtensionMethodを使用して、あなたが好きなことで見つけることができます。

WPFでTreeNodeがなくなり、代わりにTreeViewItems、ListViewListViewItemsなどがあります。したがって、これらの場合、TreeViewItemを使用する必要があります。 (あなたがTreeViewに好きなものを追加することはできますが、それはあなたのためにまとめられます)。

FindNameは、何が見つかるのかわからないのでオブジェクトを返します。期待どおりにキャストする必要がありますそうである。しかし、それはあなたが使いたいと思う行動です。また、Nameを持つ要素は、XAMLで作成された場合は自動的に登録されますが、C#/ VBで項目を作成してUIに追加する場合はそうではありません。 FindName()でアクセスできるようにするには、その名前を登録する必要があります。

ここで小さな例ツリービューアイテムを実証し、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); 
関連する問題