しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

コンテンツ ViewModel をラッピングする ItemContainerViewModel のすすめ

通常 GridView などに写真のタイルを表示する場合、ItemsSource には ObservableCollection などのように表示するコンテンツ情報を持つ ViewModel をコレクションに入れてバインドすることが多いと思います

こうする代わりに PhotoViewModel を下記のような ItemContainerViewModel の Content に設定し、ObservableCollection をバインドするようにするといろいろと融通が利きやすくなって便利です

f:id:matatabi_ux:20140720191739p:plain

何が融通が利きやすくなって便利かというと「コンテンツと表示領域(コンテナ)を分離できる」という点に尽きます

f:id:matatabi_ux:20140720192557p:plain

たとえば上記のように、同一の写真を「新着」グループと「すべての写真」グループの表示する画面を作る場合、1つの ViewModel で表示しようとすると、同じ ViewModel を2重にコレクションに追加すると選択状態が同期してしまい、画面としてどちらの表示領域が選択されたかを区別することができません

かといって同じコンテンツ情報の複製を2つのグループに分けて登録してしまうと、写真の情報が更新された際に二重にプロパティ更新をしなくてはならなくなり面倒です

このような場合は上記のような ItemContainerViewModel に表示領域(コンテナ)に関する情報を持たせて、PhotoViewModel にコンテンツとしての情報を持たせれば、お互いの情報のモデルが分離されるのですんなりと扱えるようになるというわけです

コンテンツが更新されない読み取り専用の情報である場合は ViewModel ではなく Model を Interface によって抽象化することで直接公開するのもありかもしれません