1

ビジュアル要素の Tag プロパティにバインドされた ID を持つ要素を探して、ビジュアル UI ツリーを走査できるようにしたいと考えています。

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

私は LogicalTreeHelper.GetChildren を使い始めました。これは、TreeView コントロールに到達するまで、意図したとおりに動作しているようです...その後、LogicalTreeHelper.GetChildren は子を返しません。

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

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

4

4 に答える 4

1

このサンプルを見てください。このサンプルは非常によく書かれていることがわかりました。view-model を使用すると問題が解決すると思います。

編集:ビジュアルツリーの検索について。TreeView と TreeViewItem の両方に、走査して ID を検索できる Items プロパティがあります。使えませんか?

于 2009-04-06T18:07:50.530 に答える
0

LogicalTreeHelper.GetChildren は、コントロールの LogicalChildren プロパティを調べます。このプロパティは、TreeView (ItemsControl クラスから派生) の既定では null です。GetChildren によって返されるオブジェクトの型を検査し、TreeView オブジェクトに到達したら、特別な処理ロジックを実行する必要がある場合があります。

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

于 2009-04-10T15:15:42.380 に答える
0

問題は、TreeViewItems表示されているものだけが作成されていることです.WPFはすべてのアイテムを事前に作成しません(大きなツリーには時間がかかるため、私は想像します)。

より良いアプローチは、ツリー データの構造を模倣するデータ構造を作成し、データ バインディングを使用しTreeViewてそのデータの表示方法を指示することです。もしよろしければ、簡単な例を書くことができます。

編集: あなたの編集に基づいて、UI アイテムがそのオブジェクト用に作成されている場合にのみ機能しますが、これは保証されません。IItemContainerGeneratorインターフェイスを見てください( ItemsControl.ItemContainerGeneratorを呼び出すことによって取得されます。特定のデータ オブジェクトの UI コンテナー (つまりTreeViewItem) を返すメソッドがあると思います。これは、UI コンテナーが以前に作成されている場合にのみ機能します。

于 2009-04-03T22:00:57.687 に答える
0

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

ビジュアル ツリーで注意すべきことの 1 つは、ビジュアルが読み込まれていない限り存在しないということです。コードを呼び出すポイント。

于 2009-04-10T18:38:44.047 に答える