再利用もほどほどにという事だろうか。

仕事場の同僚が、開発中の画面で↓のようなエラーが出て色々と調べていた。

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')

StackoverFlowにまさに同じエラーで悩んでいる人がいた。
WPF DataBinding Error: I have no idea how I'm getting this error
発生する状況として、何らかの状態変化をトリガーに、DataGridの表示非表示を切り替えた時に発生するらしい。
上のサイトには解決策となる情報がなかった。なので、同僚も悶々としながら探っていたらしい。

なお、AreRowDetailsFrozenプロパティは、↓のようなもの。
AreRowDetailsFrozenプロパティ
DataGridには、RowDetailという「行の詳細を表示する」という機能があったりする。行に紐付く複数項目とか、その行に関連する画像を表示してみたりする事が可能らしい。その部分を水平方向にスクロールできるかどうかの値ってところか。でも、特にRowDetailを設定しているわけでもないのに発生するんだよな。

なお、このエラー、仮想化モードを「Recycling」から「Standard」にすると発生しなくなった
「Recycling」モードは、DataGridRowだか、その子にあたるDataGridCellsPresenterクラスのインスタンスを使いまわそうとする。使い回さない「Standard」モードと違ってメモリの節約になって、良さげに思えるんだけど、どうも、リサイクルする際に、前に使っていた時の情報を中途半端に持っているらしく、上のようなエラーが出てみたり、何もしていないのにレイアウトが崩れてみたりと、自分的に良い思い出がない。
当面は「Standard」でいくしかないと改めて思った。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m