2009-04-03 9 views
1

ビジュアルUIのツリーをトラバースして、ビジュアル要素のTagプロパティにバインドされたIDを持つ要素を探したいと思っています。wpfツリービュー内のすべての項目をナビゲートする

私はこれをどうやってやっているのだろうか。コントロールには子をトラバースする必要がありません。

LogicalTreeHelper.GetChildrenは、TreeViewコントロールをヒットするまで意図したとおりに動作するように見えますが、LogicalTreeHelper.GetChildrenは子を返しません。

注:目的は、データ項目に対応するビジュアルUI要素を見つけることです。つまり、アイテムのIDがあれば、Goはそれを表示するUI要素を見つけます。

編集:私は明らかに十分にこれを説明していない。いくつかのデータオブジェクトをTreeViewコントロールにバインドし、そのビジネスオブジェクトのIDを指定してプログラム的に特定のアイテムを選択したいと考えています。データオブジェクトのIDが適切なビジュアル要素のTagプロパティにあるので、ビジュアルツリーをトラバースして、必要な要素を見つけることがなぜ難しいのか分かりません。私はMoleを使用しており、タグ内に適切なIDを持つUI要素を見つけることができます。私はちょうどコードの視覚的な要素を見つけることができません。 LogicalTreeHelperはツリー内のどのアイテムもトラバースしません。また、ItemContainerGenerator.ContainerFromItemはツリービュー内のアイテムのために何も検索しません。

答えて

0

問題は、可視であるTreeViewItemsのみが作成されていることです。WPFはすべてのアイテムを前面に作成しません(大きなツリーの場合は時間がかかるため考えられます)。

より良いアプローチは、ツリーデータの構造を模倣するデータ構造を作成し、データバインディングを使用してそのデータを表示する方法をTreeViewに伝えることです。あなたが望むなら、私は簡単な例を書くことができます。

EDIT:編集内容に基づいて、そのオブジェクトにUIアイテムが作成されている場合にのみ動作します。これは保証されません。 UIコンテナが以前に作成されている場合にのみ機能します(TreeViewItem)。

+0

TreeViewでの私の作業に基づいて、これはどのように動作します。ツリーノードの前にはビジュアルツリーがありません。これらは必要に応じてオンデマンドで作成されます。したがって、「ビジュアルツリー」を確実にナビゲートすることはできません。 –

1

はこのsampleを見てみましょう 私はこのサンプルは非常によく書かれたと私はビューモデルを使用して、あなたの問題を解決すると信じている

編集:。。。とビジュアルツリーの検索についての両方TreeViewコントロールをし、 TreeViewItemには、IDをトラバースして検索できるItemsプロパティがあります。使用できません。

+0

itemsプロパティは、ビジュアルではないデータ項目です。データアイテムを取得して対応するビジュアルアイテムを要求すると、ビジュアルアイテムのItemsプロパティ(データアイテム)を参照する必要があります。これは機能しません、私はちょうど視覚的な木を歩きたいので...ラメ –

0

LogicalTreeHelper.GetChildrenは、コントロールのLogicalChildrenプロパティを参照します。これは、ItemsControlクラスから派生したTreeViewのデフォルトではnullです。 GetChildrenによって返されたオブジェクトのタイプを調べる必要があり、TreeViewオブジェクトに来たときに特殊な処理ロジックを実行する必要があります。

この特別なロジックは、おそらくツリーのアイテムに対して反復処理を行い、FrameworkElement(Tagプロパティを定義する基本クラス)にキャストしようとしています。

0

私はVisualTreeHelperを使ってビジュアルツリーを再帰して同様のことをしました。 Jim Baltzell-Gauthierによって書かれたthis blog postをチェックしてください。これはビジュアルツリーを歩き回り、要素を名前と型で返すヘルパーメソッドを提供します。これは現在のプロジェクトで使用しているコードに似ています。これらの関数を変更して、名前の代わりにまたは名前に加えてタグ値をチェックすることができます。

ビジュアルツリーの注意点は、ビジュアルツリーがロードされていない限りそこに存在しないことです。ビジュアル要素がロードされていない場合は、ビジュアル要素の「ロード済み」イベントに代理人をアタッチする必要がありますあなたがコードを呼んだ時点でまだレンダリングされていません。

+0

デッドリンク{何か重要ではない、ちょうどコメントの長さを取得する}。 – greenoldman

+0

[OK]を更新しました - ヘッドアップのおかげでブロガーがブログエンジンを変更したようです。 –