DataGrid用ViewModelクラスを実装した(壱)。

DataGrid用のViewModelを作ったよ。(壱)と書いたけど、いきなり全部を実装(メモ)するのは無理なので、段階的に踏んでいく。
まず、「ガワ」となるクラスを作る。
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;

namespace TawamureDays.ViewModels {

using TawamureDays.Container;

/// <summary>
/// データグリッド用ViewModelクラス
/// </summary>
public class DataGridVM<TItem> : UIElementVM {
}
}

かならず必要になるのが、DataGridのItemsSourceの元となるアイテムリスト(コレクション)。これは、前に作ったObserbaleCollectionExを使うことにする。更に、このアイテムリストのビューとなるオブジェクト。この2つをまず用意する。

#region プロパティ

/// <summary>
/// アイテムソースを取得します。
/// </summary>
public ObservableCollectionEx<TItem> ItemsSource {
get; protected set;
}

/// <summary>
/// ビューをを取得します。
/// </summary>
public ListCollectionView ListViewSource {
get; protected set;
}

#endregion

setアクセサをprotectedにして、外部からはsetできなくした。インスタンスを勝手に入れ替えさせない為の処置だったりする。このコレクションを持ちたいが為に、クラス本体がジェネリック型になっている。次に、コンストラクタでこれらのプロパティのインスタンスを生成する。

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public DataGridVM() {
this.ItemsSource = new ObservableCollectionEx<TItem>();
this.ListViewSource = CollectionViewSource.
GetDefaultView(this.ItemsSource) as ListCollectionView;
return;
}

#endregion

これだけでも、一々自分で用意する手間が省けるかな。なお、仕事ではデータ仮想化を組み込んでみているので、ListCollectionViewクラスを継承した仮想化用のビュークラスを使っている。
最後。作ったら、必ず破棄のコードを書く。

#region UIElementVMメンバ

/// <summary>
/// 内部リソースを破棄します。
/// </summary>
/// <param name="disposing">false:アンマネージドのみ破棄します。</param>
protected override void OnDispose(bool disposing) {
if (this.IsDisposed) {
return;
}

base.OnDispose(disposing);

if (disposing) {
if (this.ItemsSource != null) {
if (this.ItemsSource.Count > 0) {
this.ItemsSource.Clear();
}

this.ItemsSource = null;
}

this.ListViewSource = null;
}
return;
}

#endregion
これはもはや「お約束」だ。自分以外だれが開放するというのか、いやいない(反語)。
続く。
(追記)
なお、DataGridのItemsSourceとバインドするプロパティの型で、IEnumerable型は推奨されていない。というか、データ仮想化を考えると、自然とそうなったりするけど。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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