TreeViewの検索が必要になったときに、検索の実装を制御不能にしてから、
SelectedItemプロパティを設定しました。
残念ながら、標準の
WPF TreeViewコントロールには、読み取り専用の
SelectedItemプロパティがあります。
したがって、
TreeViewに表示される
IsSelectedプロパティと
IsExpandedプロパティを各オブジェクトに導入し、これらのプロパティを対応する
TreeViewItemプロパティに関連付ける必要がありました。 (
通常、これは彼らがインターネットでアドバイスすることです )
したがって、必要なオブジェクトに
IsSelectedをインストールし、そのすべての祖先に
IsExpandedをインストールするだけです。
この実装は正常に機能しますが、...
- ビジネスオブジェクトIsSelectedおよびIsExpandedを持つのはあまり良くありません。 また、ツリー内の各アイテムのビューモデルを作成するのは面倒です。
- ツリー検索は、コードに毎回実装する必要があります。これには、少なくとも時間がかかり、1つの単語で混乱が生じます。
一般的に、少し考えた後、そのような概念に来ました。
- ツリーノード内のオブジェクトの文字列表現の一部でオブジェクトを検索します。
- ロード時に、すべての親HierarchicalDataTemplateおよびDataTemplateを通過してオブジェクトの要素のすべてのバインディングを取得する必要があり、 HierarchicalDataTemplateには子へのパスがあります。
- アイテムソースの階層的なコレクションを検索する場合。 このデータを使用して、アイテムを検索します。
- 見つかったすべての要素は、ノードへのパスによって一緒に保存する必要があります。
- 見つかった要素の1つを選択する必要がある場合は、保存されたパスに沿って目的のノードを選択するだけです。
- オブジェクト( 双方向プロパティSelectedItemの実装)を選択するだけの場合、階層ItemSourceでそれを見つける必要があり、そのパスを覚えてから、パスに沿って目的のノードを選択します。
これは、すべてのテンプレートを検索する方法です。 ここではすべてが比較的簡単です。
public override void OnApplyTemplate() { base.OnApplyTemplate(); templateDescrColl = new TemplateDescriptionCollection();
テンプレートを検索するためのロジックは次のとおりです。検索パスを指定する別の方法があることを除いて、すべてが計画どおりです。
これは、バインダーの検索が常に機能するとは限らないため、一方で必要になる場合があります。
(別のコントロールを使用してノードを表示する場合、その複雑なロジックでは確実に機能しません)。
さて、一方で、検索のパスをより正確に示す必要がある場合があります。
パスは、文字列「TypeName1:Property1、Property2 TypeName2:」としてFindPatchesプロパティを介して設定されます。
この場合、TypeName1はProperties1、Property2によって検索され、TypeName2はまったく検索されません。
private void FindDataTemplatesResources(ResourceDictionary Resource) { foreach (object xxx in Resource.Values) { DataTemplate dataTemplate = xxx as DataTemplate; if (dataTemplate != null)
これは、検索テキストを含むすべての要素の検索方法です。
これは、検索テキストを含むすべての要素の検索方法です。
int failCount;
GetTreeViewItem関数(コントロール、L [0]); 信頼できる結び目を確実に見つけることができます
大変
混乱しています。 指定されたサイトのコードに基づきます。
blogs.msdn.com/b/wpfsdk/archive/2010/02/23/finding-an-object-treeviewitem.aspxこれが新しいコードです。
myTreeViewWith search.zip検索は別のスレッドで機能します。
ユーザーが検索するプロパティを選択できるように、高度な検索を行うことができます
そして...しかし、これは装飾であり、アイデアは機能します。
PS投稿の著者である私の兄弟
SergejSh-それに関するすべての質問とコメント。