質問: ### 前提・実現したいこと WPF(MVVMパターン)を使ってツリー(TreeView)とリスト(ListBox)の表示連携をしたいと思っています。 例えば以下のような構成だとします。 ``` <TreeView イメージ> 日本 | ーー東日本 | ーー東北 --関東 ーー西日本 ``` ``` <関東を選択時のListBox> 東京 神奈川 埼玉 <東日本を選択時のListBox> 青森 秋田 東京 神奈川 ``` 上記のように、ListBoxに47都道府県のリストを入れ、 各地域を選択したときにListBoxに表示される一覧を更新させるアプリケーションを作っています。 ### ロジックについて 現時点では47都道府県(47アイテム)を持つリストをバインディングし、 ツリービューの選択遷移のイベントにてListBoxItemの`Visibility`に`Collapsed`などをsetしている動きになっています。 ``` 前提:47アイテムを持つ "一覧"という名称のリストがある。各アイテムは"件名"・"ノードパス"・"表示"プロパティを持つ。 "表示"プロパティはListBoxItemの"Visibility"とバインドされている。 1. 「東日本」をクリックする 2. "SelectedItemChanged"イベントが発生 3. "一覧"の中から"ノードパス"が「日本ー東日本」と一致もしくは「日本ー東日本」を含んでいるアイテムを探す 4. 条件が合うアイテムの"表示"プロパティを"Visible"、それ以外は"Collapsed"をsetする ``` ### 発生している問題・エラーメッセージ ただ、実際のアプリケーションではリストの全アイテム数が最大で10000件になる予定で、 3000件ほどで、ツリーを遷移したときに`Stackoverflow Exception`が発生してしまっています。 (なおイベントを抜けた後の処理で発生しているようで、具体的な箇所については特定できてません。) また件数が10件程度でも ・スクロールバーの挙動(サイズやスクロール時の)がおかしい ・ListBoxItemの`Visibility`に`Collapsed`を設定した項目が、実際には`Hidden`の動きになっている(空白にはなっているもののItemの領域が存在しているため、謎の空白の空間が生まれる) ・以下のバインディングエラーが起きる ``` System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment') ``` など様々な問題が発生しており、そもそも根本的な実装が間違えているのかと思いました。 ### 質問 上記のような機能を実装する場合、どのように実装するのがベストでしょうか? 各地域ごとに都道府県のリスト(`一覧`リスト)を持たせることも考えましたが、実アプリケーションではリアルタイムにリストのコンテンツが変動する点(同期の問題)や 例えば「東京」が含むツリーを考えると「日本」「東日本」「関東」すべてのリストに含ませる必要がある点から、非現実的だと思っています。 ### 補足 ひとまず上記のバインディングエラーと謎の空白の空間については、 ・Styleの`VerticalAlignment`や`HorizontalAlignment`を明示的に設定する ・`Visibility`が`Collapsed`のときに`Margin=0`にするトリガーを設定する などを試しましたが解決には至りませんでした。 あまりソースを出したくないのでわかりにくい説明だとは思いますが、ご助言頂けますと幸いです。
回答: draq様にご指摘いただいた 「そもそも地域で県をフィルタした結果をListBoxにバインドした方がいい気がします。」 こちらの方法で実装したところ、理想の動きになりました。 BAさせていただきたいところですが、自分が失念していたせいもあり時間が経ってしまったので自己解決とさせていただきます。 ありがとうございました。