Open4
Windows Formsでコントロールバインディング
Form内のコントロール間のプロパティをControl.Bindingsプロパティで連動させられる。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// チェックボックスのチェックが付いている時だけ、ボタンを押せるようにする
button1.DataBindings.Add("Enabled", checkBox1, "Checked");
}
}
チェックが付いていない場合にボタンを有効にしたい(フラグを反転したい)場合はBindingクラスのFormat, Parseイベントで値を書き換える。
var binding = button1.DataBindings.Add("Enabled", checkBox1, "Checked");
binding.Format += (_, e) => e.Value = !(bool)e.Value!;
binding.Parse += (_, e) => e.Value = !(bool)e.Value!;
毎回イベントハンドラ設定するのも面倒なので雑に拡張メソッドを追加してみる。
public static class Extension
{
public static void SetConveter(this Binding binding, Func<object, object> converter)
{
void ConvertMethod(object? sender, ConvertEventArgs e) => e.Value = converter(e.Value!);
binding.Format += ConvertMethod;
binding.Parse += ConvertMethod;
}
}
WPFでよくある「テキストボックスの内容をリアルタイムでプレビューする」みたいな例:
var binding = label1.DataBindings.Add("Text", textBox1, "Text");
binding.SetConveter(value => ((string)value).ToUpper());