1

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

System.Windows.Controls.TreeView.Items <-名前でFind()または[]がないようです。

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

実際には、FindNameはオブジェクトを返すため機能しないように見えますが、サブアイテムを追加することもできません。

2番目の注意事項:WinFormsのようなTreeNodeを提供しないため、このようなクラスを使用してアイテムをロードするのは間違っていますか?

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

1 に答える 1

1

.WhereTreeView.ItemsコレクションでExtensionMethodを使用して、必要なものを検索できます。

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 に答える