Open4

Windows Formsでコントロールバインディング

wadawada

Form内のコントロール間のプロパティをControl.Bindingsプロパティで連動させられる。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // チェックボックスのチェックが付いている時だけ、ボタンを押せるようにする
        button1.DataBindings.Add("Enabled", checkBox1, "Checked");
    }
}

wadawada

チェックが付いていない場合にボタンを有効にしたい(フラグを反転したい)場合は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!;
wadawada

毎回イベントハンドラ設定するのも面倒なので雑に拡張メソッドを追加してみる。

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;
    }
}
wadawada

WPFでよくある「テキストボックスの内容をリアルタイムでプレビューする」みたいな例:

var binding = label1.DataBindings.Add("Text", textBox1, "Text");
binding.SetConveter(value => ((string)value).ToUpper());