Windows FormsでMVVMをやるぜ

WPF使いのMVVMといふものを、Forms使いもしてみむとてするなり。
この記事はそんな大それたものでなく、いまだにFormsを使ってる私がデータバインディングの楽しさに目覚めつつあるよ、という雑文です。

FormsでWindowsアプリを作るとこんな感じになります。
Personクラスのリストがあり、それをリストボックスに表示する例です。

List<Person> persons;

listBox1.Clear();
foreach (var p in persons) {
    listBox1.Add(p.Name);
}

…

persons.Add(newPerson);
listBox1.Add(newPerson.Name);

Personリストに追加があればリストボックスにも追加しなければなりません。
リストボックスをフィルタしたい場合は以下のようになります。

listBox1.Clear();
foreach (var p in persons) {
    if (p.Name.Contains(filterString)) {
        listBox1.Add(p.Name);
    }
}

データをいじるところがあればリストボックスの変更も同時に発生してしまうのが面倒です。
仕様変更でリストボックスに表示するのがNameではなくFullNameになったら?リストボックスではなくリストビューを使うようになったら?はい、全箇所修正です。

データバインディングを使うと以下のようになります。
あ、WPF使えなくても大丈夫ですよ。Formsにもデータバインディング機能があるので。

BindingList<Person> persons;

listBox1.DataSource = persons;
listBox1.DisplayMember = "Name";

…

persons.Add(newPerson);

以上です。
Personリストに要素が追加されるとリストボックスにも自動で追加されます。
また表示するのがFullNameになっても、DisplayMemberを"FullName"に変えるだけで終わりです。
フィルタ機能は以下のようになります。

listBox1.DataSource = persons.Where( p => p.Name.Contains(filterString) ).ToList();

以上です(笑
フィルタはデータの絞り込みのみに注目し、リストボックス再構築という本質的でない作業は気にせずにすむのがイイです。