DataGrid用のViewModelを作ったよ。(壱)

仕事では、DataGrid用のViewModelとして、
・DataGridそのものに対するViewModel
・DataGridの各アイテム(行)に対するViewModel
を作った。イベントと連動させるコマンドや、その他のお決まりなプロパティ、メソッドを逐一Window用のVMに実装するのもどうかと思ったし、再利用という点から見れば、あまりよろしくなかったからだ。

○DataGridコントロールに対するViewModel
 DataGridのDataContextに設定する前提のオブジェクトとなる。
 ◇プロパティ(基本)
  ・ItemsSource
   DataGridの各行(アイテム)を格納する為のプロパティ。これが無いのはありえない。
   型は、ObservableCollectionEx<T>型。編集可能(追加,更新,削除有)なDataGridでは、行(アイテム)の増減を検知する必要があるので、これを使う。
  ・ListViewSource
   ItemsSourceに対するViewとなる。Viewの基底となるListCollectionViewクラス(System.Windows.Data)を拡張しているので、DataGridのItemsSourceプロパティにバインドさせるのはこちらになった。
   ItemsSourceをバインドしても良いけど、ソート、フィルタ等はビューに対して行われるので、結局、このプロパティは必要になった。
  ・CurrentItem
   DataGridのCurrentItemプロパティと連動させたかったプロパティ。でも、フォーカスが外れるだけでnullになる仕様だったので、CellChangedイベントを駆使して取得することになった。
   結果としては、「設定すると、そのアイテムまでスクロールさせて表示させる」というところまではできた。
  ・SelectionChangedCommand
   DataGridのSelectionChangedイベントと連携する為のコマンド。
  ・DoubleClickedCommand
   DataGridのDoubleClickedイベントと連携する為のコマンド。
  ・CellClickedCommand
   DataGridのCellClickedイベントと連携する為のコマンド。
  ・CellChangedCommand
   DataGridのCellChangedイベントと連携する為のコマンド。
  ・IsEnabledプロパティ
   DataGridのIsEnabledと連動させたいプロパティ。何らかの処理中で、ユーザに触って欲しく無い時にFalseにできる。
 ◇メソッド(基本)
  ・ItemsSource操作系。
   ItemsSourceプロパティへのアイテム追加や削除を実行する為のメソッド。
  ・ListViewSource操作系
   ListCollectionViewクラスが持つ、ソートやフィルタに対する操作を提供するメソッド。特定のアイテムがビューに表示されているかどうかも確認できる。
  ・CurrentItem操作系
   CurrentItemプロパティに対するというよりは、移動系に使うメソッド。
   当然、ビュー側との連携が必須。
  ・検索系
   ビュー内の指定のアイテムを検索したり、ビュー上のインデックスを取得する為のメソッド。
  ・移動系
   指定されたアイテムが表示されるようにスクロール移動させたりするメソッド。
   当然、ビュー側との連携が必須。
 ◇イベント
  ・ItemPropertyChanged
   DataGrid内のItemが持つプロパティが変更された時に発生するイベント
   ObservableCollectionEx<T>は、アイテムの増減は検知するけど、アイテムのプロパティ値の変更は検知できない。
   CollectionChangedイベントにメソッドを登録して、
    追加→追加されたアイテムのPropertyChangedイベントにハンドラを登録する。
    削除→削除されたアイテムのPropertyChangedイベントからハンドラを削除する。
   を行う必要がある。
  ・CurrentItemChanged
   現在アイテムが変更された時に発生するイベント
  ・ItemsCollectionChanged
   リストへの追加や削除が行われた時に発生するイベント
 ◇終了処理
  ViewやItemsSourceのクリア、イベントからのハンドラ削除、プロパティのクリア等々。
  特にイベントのハンドラ削除は、メモリリークを抑制したいなら必須の処理となる。
 一度に実装したわけではなく、基本を実装し、必要になれば、追加実装していく形になった。使う予定も可能性もなければ、実装を見送っても良いと思う。
続く
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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