質問
私は視覚的な要素のTagプロパティにバインドされたIDを持つ要素を探して、ビジュアルUIツリーをトラバースすることができるようにしたい。
私は私がこれを行う方法を思ったんだけど。コントロールが通過する子供を持っていません。
私が意図したとおりに動作しているようですLogicalTreeHelper.GetChildrenを、使用を開始し、私は、TreeViewコントロールを打つアップまで...その後LogicalTreeHelper.GetChildrenは子を返しdoesntの。
注:目的は、データ項目に対応する視覚的なUI要素を見つけることです。これは、アイテムのIDを指定して、それを表示するUI要素を探しに行くれます。
編集:私は明らかに十分にこれを説明するわけではないのです。私は、TreeViewコントロールにいくつかのデータオブジェクトを結合して、programaticlyそのビジネス・オブジェクトのID与えられた特定の項目を選択したいのです。私はビジュアルツリーをトラバースし、私が欲しいの要素を見つけることは難しい理由は、データオブジェクトのIDは、適切な視覚的要素のTagプロパティにあるように、参照いけません。私はほくろを使用していると私はそれのタグに適切なIDとUI要素を見つけることができています。私はコード内の視覚的な要素を見つけることができません。 LogicalTreeHelperは、ツリー内のすべてのアイテムを横断していません。どちらもItemContainerGenerator.ContainerFromItemは、ツリービュー内の項目のために何を取得していないんます。
正しい解決策はありません
他のヒント
このサンプルを見てください。 私は、このサンプルは非常によく書かれたと私は、ビューモデルを使用して、あなたの問題を解決すると信じています。
の編集をビジュアルツリーの検索について。ツリービューとツリービューアイテムの両方は、あなたが横断し、自分のIDを検索することができItemsプロパティを持っています。あなたはそれを使用することができませんか?
問題が表示されているだけTreeViewItems
が作成されていることです。
より良い方法は、あなたのツリーデータの構造を模倣するデータ構造を作成すること、およびそのデータを表示する方法をTreeView
を伝えるためにデータバインディングを使用します。あなたがしたい場合、私は、簡単な例を書くことができます。
EDIT:あなたの編集に基づいて、UI項目は保証されません、そのオブジェクト用に作成されている場合のみ動作します。 ( IItemContainerGenerator のインターフェースを見てみましょう ItemsControl.ItemContainerGenerator を呼び出すことによって取得。私は、指定されたデータオブジェクトのためのUIコンテナ(すなわちTreeViewItem
)を返しますメソッドを持っていると信じています。UIコンテナは以前に作成されている場合にのみ動作すること。
LogicalTreeHelper.GetChildrenは(ItemsControlにクラスから派生)ツリービューのために、デフォルトではnullであるコントロールのプロパティLogicalChildren、調べます。あなたがGetChildrenメソッドによって返されるオブジェクトの種類を検査するために持っていて、ツリービューオブジェクトに来たときに、その後、いくつかの特別な処理ロジックを行う可能性があります。
特別なロジックは、おそらくツリーのアイテムを反復処理とのFrameworkElement(Tagプロパティを定義する基本クラス)にそれらをキャストしようとされること。
私はVisualTreeHelperを使用して、ビジュアルツリーを再帰で同様のことを行っています。書かれたチェックアウトこのブログ記事でジムBaltzell-Gauthierのことで - それはビジュアルツリーを歩くと、名前とタイプで要素を返すために、いくつかのヘルパーメソッドを提供し、これは私が私の現在のプロジェクトで使用していたコードに似ています。あなたは、それは代わりに、または名前に加えて、タグの値を確認持つように、これらの機能を変更することができます。
視覚的にはされていない場合、あなたの視覚的な要素の「ロードされた」イベントにデリゲートを添付する必要があるかもしれません -ビジュアルツリーで注意すべきことの一つは、それがビジュアルがロードされていない限りはないがあるということですあなたがコードを呼び出す時点では、まだレンダリングされます。