【WPF】「ListBoxやListViewの行番号を出力する。創造的プログラミングと粘土細工プログラミング関連Blog私の興味の端から端までをお届けします!【免責事項】このサイトの情報は私の個人的な見解で、私以外の意見を代弁するものではありません。【WPF】「ListBoxやListViewの行番号を出力する。Sunday【WPF】ListBoxやListViewの行番号を出力する。上記の投稿でアップロードしているサンプルコードをちょっとだけ変更してみると動かなくなることに気づきました。いう変更かというと1.VirtualizingStackPanel.VirtualizationMode="Recycling"ほかにもあります。このどちらかを実行すると不振な動きをします。1は、交互に色を変えるところでぶっこけます。添付プロパティで無理矢理実装しているのですが、その部分を外しても、まだ挙動がおかしいままです。このアプリケーションは行番号を振るような仕掛けをしているのですが、まるででたらめな行番号が降られているのがわかります。これは以前紹介したhttp://pro.art55.jp/?eid=1163592の前半部分と同じ現象が起きていることが想像できます。ああ、これは番号を取得するロジックが間違っているわけではないのでそこは注意が必要です。---------------------------------追記)よくよくみるとこのロジックも怪しいですね・・・ダメダメです。ここに関しては別途検証する必要がありますね。/>番号を出力するTextBlock部分のXAMLは上記のようになっています。TextBlockのインスタンスからみてVisulTreeの親方向へ向かってListBoxItemを検索し、そのListBoxItemインスタンスをデータソースとしてバインドします。このインスタンスをConvertし番号を生成しているわけです。問題ないように見えますが、これではBinding式の評価タイミングに問題が出てしまいます。上記のバインディングではListBoxItemが生成されたタイミングでしか評価されません。よってListBoxがRecyclingモードで動作している場合はListBoxItemが使い回される為、スクロールさせるだけではListBoxItemは新規に生成されません。選択行を変えるとか、画面サイズを拡大するなどの行為を行えば、ListBoxItemが生成された分だけ正しい行番号を得ることができます。今回はこれを修正せずにさらにイメージをふくらませて行こうと思います。解決できそうなコーディングを闇雲に行うのではなく、頭の中で仕組みをイメージすることも大切だと私は思います。ListBoxの見た目に関与する部分の構造をまずみていくと、ListBoxにはPanelが包含され、PanelのChildren(UIElementCollection)にListBoxItemが格納されます。このChildrenに格納されているインスタンスは当然インスタンス化されているListBoxItemであり、ListBoxItemはコンテンツを持っています。次にListBoxのコンテンツ部分に着目してみます。ListBoxはItems内にコンテンツのコレクションを所持します。コンテンツは常にListBoxItemのコンテンツとしてListBoxItem中でインスタンスに存在する訳ではなく、Panelの種類や指定されたプロパティによって、ListBoxItemに関連づけられたり、独立した状態になったりします。私がよく書いているとんち絵でRecyclingを表現すると下記のようなイメージになります。下記は初期化を終えたListBoxを表す画面です。上からContent01、Content02・・・Content06と表示できるだけのコンテンツを抱えています。表示仕切れていないものに対してはListBoxItemは用意されていません。スクロールバーを下に下げ、下方のあるコンテンツを表示させます。すると上の見えなくなったListBoxItemが見えなくなってしまいます。見えなくなったListBoxItemは関連付いてたコンテンツとの関連をはずし、次に表示されるコンテンツと関連付きます。ListBoxItem自身はコンテンツ以外のプロパティはそのままの状態を保持しています。して、一度、上部から外れたListBoxItemは新しいコンテンツを抱えて下方より現れてくる訳です。ちなみに、とんち絵なのでListBoxItemのリサイクリングがぱっつんぱっつんになっていますが、実際にももっと余裕のあるListBoxItemの数がそろっているはずです。何が変化したのでしょうか?ListBoxItemオブジェクト自身は使い回されているため、変化していません。状態は状況によってケースバイケースですが、確実に変わったのがコンテンツです。いうことで、イメージはだいたいつかめました。【WPF】ListBoxやListViewの行番号を出力する。コードの修正に入れそうですが、今回はここまででいったん止めます。