Binding使ってます?

HTMLの手動解析はもう嫌だ・・・とかちょっと弱っているのですが、ネタがないので結局Visual Studio立ち上げる羽目に。(^^;

さて、WinFormなアプリを作るとコントロールに値を入れたり戻したりという単純作業に結構手間が掛かったりします。この辺の設計はMVCとか使ったりするのでしょうが、.NETではBindingという仕組みが提供されています。が、ASP.NETだとよく使いますが、通常のWinFormアプリだと、結構使ってなかったりします。(私だけ?)

ほとんど使ってない機能なので、簡単なサンプルで実験してみました。

public class Data {
  public int num;
  public int Number {
    get { return num; }
    set { num = value; }
  }
}

Data data = new Data();

private void Form1_Load(object sender, System.EventArgs e) {
  // プロパティじゃないとバインディング出来ない
  // label1.DataBindings.Add("Text", data, "num");
  // ラベルにバインディング
  label1.DataBindings.Add("Text", data, "Number");
  // テキストボックスにバインディング
  textBox1.DataBindings.Add("Text", data, "Number");
  // アップダウンコントロールバインディング
  numericUpDown1.DataBindings.Add("Value", data, "Number");
  // プログレスバーバインディング
  progressBar1.DataBindings.Add("Value", data, "Number");
}

Form周りは無駄にコードが多いので、ざっくりと省いてBindingのところだけを抜粋。コントロールとデータを関連づけてやると、コントロールの値を変更すると対応するデータが自動的に変わります。もちろん、一つのデータを複数のコントロール(ビュー)に関連づけることも出来、例の場合だと、例えば、アップダウンコントロールの値を変えてやると、ラベルもテキストボックスもプログレスバーも変更されます。中々面白いんですが留意点があります。

  • Binding出来るのはプロパティ。(フィールドは駄目)
  • 値が反映されるタイミングはコントロールがフォーカスを失ったとき

また、見ての通り、コントロールとデータの対応付けをべたに書くのは面倒です。この辺は、ネーミングルールを決めてリフレクションでざっくりやるのが良さそうですね。