前提・実現したいこと
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
にするトリガーを設定する
などを試しましたが解決には至りませんでした。
あまりソースを出したくないのでわかりにくい説明だとは思いますが、ご助言頂けますと幸いです。
回答2件
あなたの回答
tips
プレビュー